3

我们最近将我们的应用程序从 servlet 2.5 转换为 servlet 3.0,以便我们可以使用动态 servlet 配置。

我们使用 Spring 的 SpringServletContainerInitializer 来初始化我们的应用程序,并使用我们代码中的相应 WebApplicationInitializer 实例来初始化我们的应用程序。这种方法在 Tomcat 中有效,但是在部署到 Websphere 8.5.0.1 时,SpringServletContainerInitializer 无法在我们的代码中找到 WebApplicationInitializer 接口的实现,因此没有创建我们的 Spring MVC 调度程序 servlet。

我们在网上发现了一篇博文,作者无法让它发挥作用。

我们尝试过弄乱类加载器、类加载顺序,并通过其他方式验证 servlet 3.0 在容器中是否正常工作,并且似乎没问题。使用 WAS 类加载器查看器,我们可以看到 SpringServletContainerInitializer 类和 WebApplicationInitializer 接口已加载,但未加载我们的 WebApplicationInitializer 实现。

有没有人在 Websphere 中尝试过这个?我们认为这可能是类加载器问题,但最终毫无头绪。

4

2 回答 2

3

我刚看到这个贴。当调试类加载器问题时,WebSphere 提供了跟踪,当启用该跟踪时,可以提供更多关于正在发生或未发生的事情的详细信息。它是在您打开 PMR 时 IBM Support 要求的必须收集的数据中提供的。但它很容易阅读和理解输出。

http://www-01.ibm.com/support/docview.wss?uid=swg21196187#show-hide 在“手动收集数据”下,要使用的跟踪字符串是

com.ibm.ws.classloader.*=all

于 2013-06-19T16:02:03.950 回答
1

我有完全相同的问题。问题是由以下 APAR http://www-01.ibm.com/support/docview.wss?uid=swg1PM85177修复的 WebSphere 中的一个缺陷。WebSphere 会构建注释缓存,并且由于缓存已满时的缺陷,它会丢弃以前缓存的注释,导致 SpringServletContainerInitializer 找不到 WebApplicationInitializer 的所有实现。

此 APAR 已在 8.0.0.8 中发布,并计划在 8.5.5.2 发布,而 8.5.5.2 又计划在 4 月 28 日发布。与此同时,我设法将缓存的大小从默认的 2000 增加到 16000(在 4000 和 8000 时失败),此时我的应用程序开始工作。一种大小并不适合所有大小,因为缓存大小被 JVM 上的系统属性覆盖,用于 WebSphere 节点,适当的大小将取决于该节点上运行的应用程序以及它们(及其 JAR)如何使用注释,因此它将在确定您的应用程序的正确值之前,请务必使用此设置。

我使用的JVM系统属性是-Dclassinfocachesize=16000

于 2014-03-19T23:41:44.823 回答