Websphere 8.5 и SpringServletContainerInitializer


Мы недавно преобразовали наше приложение из сервлета 2.5 в сервлет 3.0, так что мы можем использовать динамическую конфигурацию сервлета.

Мы используем SpringServletContainerInitializer для инициализации нашего приложения с соответствующим экземпляром WebApplicationInitializer, который живет в нашем коде. Этот подход работает в Tomcat, но при развертывании в Websphere 8.5.0.1 SpringServletContainerInitializer не может найти реализацию интерфейса WebApplicationInitializer в нашем коде, таким образом, наш Spring MVC dispatcher servlet не создается.

Мы нашли один пост в блоге в интернете, где автор не смог заставить его работать.

Мы пробовали возиться с загрузчиком классов, заказами на загрузку классов и проверяли, что сервлет 3.0 работает в контейнере другими средствами, и, похоже, с этим все в порядке. Используя средство просмотра загрузчика классов WAS, мы видим, что класс SpringServletContainerInitializer и интерфейс WebApplicationInitializer загружены, но не наша реализация WebApplicationInitializer.

Кто-нибудь пробовал это в Websphere? Мы думаем, что это может быть проблема загрузчика классов, но в конечном счете невежественны.

2 3

2 ответа:

У меня был точно такой же вопрос. Проблема заключается в дефекте WebSphere, исправленном следующим APAR http://www-01.ibm.com/support/docview.wss?uid=swg1PM85177 WebSphere создает кэш аннотаций и из-за дефекта при заполнении кэша выбрасывает ранее кэшированные аннотации, в результате чего SpringServletContainerInitializer не находит все реализации WebApplicationInitializer.

Этот APAR уже был выпущен в 8.0.0.8 и запланирован для 8.5.5.2 который, в свою очередь, запланирован на 28 апреля. Тем временем мне удалось увеличить размер кэша с 2000 по умолчанию до 16000 (он не работает при 4000 и 8000), после чего мое приложение начало работать. Один размер не подходит всем, так как размер кэша переопределяется системным свойством на JVM для узла WebSphere соответствующий размер будет зависеть от того, какие приложения запущены на этом узле и как они (и их банки) используют аннотации, поэтому будет важно играть с Эта настройка выполняется до тех пор, пока не будет определено правильное значение для вашего приложения(приложений).

Системное свойство JVM, которое я использовал, - Dclassinfocachesize=16000

Я только что видел это сообщение. При отладке проблем с загрузчиком классов WebSphere предоставляет трассировку, которая при включении может дать более подробную информацию о том, что происходит или не происходит. Он содержится в данных mustgather, которые Служба поддержки IBM запросит, если вы откроете PMR. Но это достаточно легко прочитать и понять результат.

Http://www-01.ibm.com/support/docview.wss?uid=swg21196187#show-hide в разделе "сбор данных вручную" строка трассировки для использования is

Com. ibm. ws. classloader.*=all