Ошибка инициализации сервлета после развертывания в Oracle AS 10g

У меня есть веб-приложение, которое отлично работает в моей локальной среде [http://localhost:8080/myApp/] в Apache Tomcat 7.0.47. Я использую Spring Framework.

Проблема возникает после развертывания моего веб-приложения на сервере приложений Oracle 10g, версия 10.1.3.4.0. Приложение успешно развернуто в AS. Но когда я пытаюсь запросить мое приложение, сервер отвечает:


500 - внутренняя ошибка сервера

Ошибка сервлета: возникла исключительная ситуация. Текущие дескрипторы развертывания приложения не позволяют включать его в этот ответ. Пожалуйста, обратитесь к журналу приложений для деталей.


Позвольте мне поставить мой диагноз:

  1. Веб-контейнер успешно развертывает myApp.ear
  2. После развертывания веб-контейнер выполняет:
    • НАГРУЗКИ Класс сервлетов
    • УСТАНАВЛИВАЕТ загруженный класс сервлетов
    • ИСПОЛЬЗУЕТ метод init() экземпляра ----> НЕ СДЕЛАНО ЗДЕСЬ

Вот мой фрагмент журнала приложения:

14/02/18 09:26:56.617 etrr: Initializing Spring FrameworkServlet 'spring'
14/02/18 09:26:57.105 etrr: Error initializing servlet
java.lang.NoSuchMethodError: org.springframework.beans.factory.config.ConfigurableListableBeanFactory.registerResolvableDependency
    (Ljava/lang/Class;Ljava/lang/Object;)V
    at org.springframework.web.context.support.WebApplicationContextUtils.registerWebApplicationScopes(WebApplicationContextUtils
    .java:156)
    at org.springframework.web.context.support.AbstractRefreshableWebApplicationContext.postProcessBeanFactory(AbstractRefreshableWebApplicationContext
    .java:143)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:331)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:332)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:266)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:236)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:126)
    at javax.servlet.GenericServlet.init(GenericServlet.java:256)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.HttpApplication.loadServlet(HttpApplication.java:2379
    )
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.HttpApplication.findServlet(HttpApplication.java:4830
    )
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.HttpApplication.findServlet(HttpApplication.java:4754
    )
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.HttpApplication.getRequestDispatcher(HttpApplication
    .java:3412)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler
    .java:738)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.HttpRequestHandler.processRequest(HttpRequestHandler
    .java:453)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.AJPRequestHandler.run(AJPRequestHandler.java:313)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].server.http.AJPRequestHandler.run(AJPRequestHandler.java:199)
    at oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(ServerSocketReadHandler.java:260)
    at oracle.oc4j.network.ServerSocketAcceptHandler.procClientSocket(ServerSocketAcceptHandler.java:234)
    at oracle.oc4j.network.ServerSocketAcceptHandler.access$700(ServerSocketAcceptHandler.java:29)
    at oracle.oc4j.network.ServerSocketAcceptHandler$AcceptHandlerHorse.run(ServerSocketAcceptHandler.java:879)
    at com.evermind[Oracle Containers for J2EE 10g (10.1.3.4.0) ].util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor
    .java:303)
    at java.lang.Thread.run(Thread.java:595)

Возможно, стоит упомянуть, что мой контейнер OC4J загружает классы, упакованные в мое веб-приложение, переопределяя системные классы или классы на более высоком уровне моего контейнера OC4J. Я написал следующие два свойства в моем файле ../WEB-INF/orion-web.xml. (см. ответ @drorb для более подробной информации)

<web-app-class-loader search-local-classes-first="true" 
                      include-war-manifest-class-path="true" />

Спасибо заранее за вашу помощь.

2 ответа

Решение

Это похоже на проблему с загрузкой классов. Трассировка стека показала, что у вас есть старая версия Spring где-то в пути к классам вашего приложения. Загрузчик классов загружает старую версию org.springframework.beans.factory.config.ConfigurableListableBeanFactory который не имеет registerResolvableDependency метод с запрошенной подписью.
Этот класс является частью баночки с весенними бобами. В старых версиях это было частью пружинного ядра.

Для отслеживания загрузки классов OC4J вы можете использовать class.load.trace системное свойство. Посмотрите на этот ответ в сообществе OTN для более подробной информации.

Я узнал источник моей проблемы.

Под ../myWebApp/WEB-INF/lib расположены все мои файлы org.springframework.X-3.0.2.RELEASE. Но внутри есть и другой источник. В его файле MANIFEST написано Spring v. 2.0.7, что приводит к конфликту между различными версиями Spring.

Так как я не являюсь автором этого приложения, я просто упустил из виду эту весеннюю библиотеку JAR. Я решил эту ошибку, изменив скрипт ANT, т.е. исключив упомянутый файл JAR при сборке Enterprise ARchive.

Другие вопросы по тегам