我收到此错误:

java.lang.ClassCastException:org.apache.jcp.xml.dsig.internal.dom.DOMReference无法转换为org.jcp.xml.dsig.internal.dom.DOMReference

也许问题出在servlet的jboss-deployment-structure.xml上:

 <?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
  <deployment>
    <dependencies>
      <module name="javax.api"/>
      <module name="org.apache.santuario.xmlsec"/>
      <module name="org.apache.xerces" />
      <system export="true">
        <paths>
          <path name="com/sun/org/apache/xerces/internal/dom"/>
        </paths>
      </system>
    </dependencies>
  </deployment>
</jboss-deployment-structure>

您有什么提示吗?

提前致谢。

最佳答案

您的问题是不同的xmlsec库版本。
位于xmlsec-1.5.1.jar中的org.apache.jcp.xml.dsig.internal.dom.DOMReference(JBoss中的org.apache.santuario.xmlsec模块)
位于xmlsec-1.4.3.jar中的org.jcp.xml.dsig.internal.dom.DOMReference(依赖于pom.xml)

Jboss 7使用隔离的模块https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7,它很复杂,我真的不知道它在内部如何工作。

但是如果简化了,当jboss启动时,它将加载xmlsec-1.5.1,而当启动您的应用程序时,它将加载xmlsec-1.4.3。结果,当在jboss和webapp的classloders之间传递DOMReference对象时,您具有类强制转换异常。

您可以通过多种方式解决问题:

  • 删除jboss-deployment-structure.xml中org.apache.santuario.xmlsec模块的依赖性。应用程序将使用他自己定义的xmlsec-1.4.3库
  • 在pom.xml中找到依赖项xmlsec,将version设置为1.5.1,并将scope设置为provided。应用程序将使用JBoss模块和xmlsec-1.5.1
  • 在pom.xml中找到依赖项xmlsec并完全排除它(如果您的代码符合没有xmlsec依赖项)。应用程序将使用JBoss模块和xmlsec-1.5.1
  • mvn:dependency:tree命令在这里有帮助。

    10-06 07:21