我有两个 WAR 部署到同一个 Tomcat 7 实例,并且都使用 CXF + WSS4J。这两个应用程序通过 SOAP 进行通信,WSS4J 拦截器处理 SOAP 标头中的 SAML 断言。当单独测试每场战争时,一切正常,但是当两个应用程序都部署并且一个应用程序向另一个应用程序发送 SOAP 消息时,我收到以下 ClassCastException:
java.lang.ClassCastException: org.apache.ws.security.WSDocInfo cannot be cast to org.apache.ws.security.WSDocInfo
对我来说,这意味着一个类加载器问题,但具体是什么我无法弄清楚。每个应用程序在其各自的 WEB-INF/lib 文件夹中都有自己的 WSS4J 副本,我在 Tomcat 的公共库中看不到任何 WSS4J 库。
在生产环境中,这两个应用程序很可能永远不会使用同一个 JVM,更不用说在同一个 Tomcat 实例中了,但是当我了解这个问题的底部时,我会感觉更舒服。它还有助于从开发中的同一个 Tomcat 实例启动这两个应用程序。有谁知道问题可能是什么?
更新 1: 我将每场战争部署在单独的 Tomcat 实例中,这些实例都使用相同的 JVM,并且 ClassCastException 消失了。Tomcat类加载一定是我不理解的东西吗?