2015-04-21 3 views
0

Нам нужно перенести приложение, которое работает на Glassfish, на версию сервера WebSphere Application Server (WAS) 8.5.x.Ошибка инициализации сервлета сервера приложений WebSphere

Чтобы убедиться, что все работает правильно с простой настройкой, я создал образец проекта с одним сервисом отдыха.

Я не расширил javax.ws.rs.core.Application с моим собственным классом, и у меня есть класс с аннотациями пути. Я определил сервлет в web.xml с именем «javax.ws.rs.core.Application», чтобы аннотации были отсканированы, и ожидается, что службы будут доступны из заданного сервлет-отображения URL-адресов.

Когда я пытаюсь получить доступ к службе, я получаю сообщение 404. Но реальной проблемой является Apache Wink, который поставляется со стандартными библиотеками IBM Websphere.

В библиотеке source code (класс DefaultLifecycleManager), есть часть, как это:

79  if (ApplicationMetadataCollector.isApplication(cls)) { 
80   // by default application subclasses are singletons 
81   return LifecycleManagerUtils.createSingletonObjectFactory(cls); 
82  } 

isApplication (ЦБС) метод должен возвращать верно, а затем должен быть создан синглтон завод для него. Однако он возвращает false. Тело метода следующее:

76 public static boolean More ...isApplication(Class cls) { 
77  return Application.class.isAssignableFrom(cls); 
78 } 

Я поставил там точку останова и проверил значения. cls - это точно javax.ws.rs.core.Application, который является тем же классом в 77-й строке.

Это приводит к тому, что сервлет не запускается правильно и возвращает 404 к каждому запросу, который отображается на нем.

Я не знаю, как этот метод возвращает false, и мне нужна ваша помощь.

+0

Проверьте, имеет ли ваш web.xml версию 3.0. Также проверьте SystemOut.log, если у вас есть исключения во время запуска сервера и приложения. – Gas

+0

Да, web.xml - версия 3.0. Кроме того, он не выводит никаких исключений, если я не расширяю класс Application с помощью my. Если я продлю его, поведение останется прежним, и он распечатает трассировку стека, ведущую к классам, которые я объяснил выше. Исключенное исключение - это «IllegalArgumentException», брошенное в DefaultLifecycleManager после отказа от создания объекта с помощью метода createObjectFactory (который вызывает метод isApplication (cls).) –

ответ

0

В вашем приложении что-то не так, может быть, у вас есть конфликтующие библиотеки.

У меня есть очень простой класс:

@Path("/HelloRest") 
public class Hello { 

    @GET 
    public String hello() { 
     System.out.println("Rest called"); 
     return "Hello " + new Date(); 
    } 
} 

со следующими web.xml, который начинается и работает нормально на WAS 8.5.5:

<servlet> 
    <servlet-name>javax.ws.rs.core.Application</servlet-name> 
</servlet> 

<servlet-mapping> 
    <servlet-name>javax.ws.rs.core.Application</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

при вызове http://localhost:9080/JAXRSTestWeb/rest/HelloRest

0

Если у вас есть или трикотаж или любую другую библиотеку jaxrs, содержащуюся в вашем приложении, удалите ее.

0

Я недавно сделал почти то же самое, когда я перешел на форму WAS 7.0 to WAS 8.5. WAS 8.5 поставляется с встроенным Apache Wink 1.1. Вы можете выполнить следующие шаги, чтобы перенести приложение на WAS 8.5:

1) Удалите все java-файлы apache из папки вашего приложения lib.

2) Для создания приложения вы можете использовать эти две веб-страницы jar, com.ibm.ws.prereq.jaxrs.jar и com.ibm.ws.prereq.jackson.jar. вы можете найти эти банки в WAS_HOME/плагины папку.

3) Создайте приложение с помощью этих банок, но не упаковывайте эти банки в ваше приложение EAR или WAR.

4) Если ваш тип приложения EAR, то убедитесь, что все остальные ресурсы и класс, который расширяет класс Application, является частью войны.

5) Повторно разверните приложение, оно должно работать нормально.

Смежные вопросы