我有两个 WAR 部署到同一个 Tomcat 7 实例,并且都使用 CXF + WSS4J。这两个应用程序通过 SOAP 进行通信,WSS4J 拦截器处理 SOAP header 中的 SAML 断言。单独测试每场 war 时,一切正常,但是当部署了两个应用程序并且一个应用程序向另一个应用程序发送 SOAP 消息时,我收到以下 ClassCastException:
java.lang.ClassCastException: org.apache.ws.security.WSDocInfo cannot be cast to org.apache.ws.security.WSDocInfo
对我来说,这意味着一个类加载器问题,但具体是什么我无法弄清楚。每个应用程序在各自的 WEB-INF/lib 文件夹中都有自己的 WSS4J 副本,我在 Tomcat 的公共(public)库中没有看到任何 WSS4J 库。
在生产中,这两个应用很可能永远不会使用相同的 JVM,更不用说在同一个 Tomcat 实例中了,但是当我弄清这个问题的根源时,我会感觉更舒服。它还有助于从开发中的同一个 Tomcat 实例启动两个应用程序。有没有人知道问题可能是什么?
更新 1: 我在单独的 Tomcat 实例中部署了每场 war ,它们都使用相同的 JVM,并且 ClassCastException 消失了。一定是我对 Tomcat 类加载不了解?
最佳答案
来自 WSS4J 问题跟踪器:
https://issues.apache.org/jira/browse/WSS-282
STRTransform JCE 提供程序抛出 java.lang.ClassCastException:org.jcp.xml.dsig.internal.dom.DOMSubTreeData 与 Websphere 中的 javax.xml.crypto.OctetStreamData 不兼容
受影响的版本:1.6
咳咳……
关于tomcat - 在 Tomcat 中部署了多个 war 的 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7349843/