JBoss EAP 7 => ClassCastException:org.apache.jcp.xml.dsig.internal.dom.DOMReference 无法转换为 org.jcp.xml.dsig.internal.dom.DOMReference

JBoss EAP 7 => ClassCastException: org.apache.jcp.xml.dsig.internal.dom.DOMReference cannot be cast to org.jcp.xml.dsig.internal.dom.DOMReference

我收到这个错误:

java.lang.ClassCastException: org.apache.jcp.xml.dsig.internal.dom.DOMReference cannot be cast to 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 库版本。 org.apache.jcp.xml.dsig.internal.dom.DOMReference 位于 xmlsec-1.5.1.jar(JBoss 中的 org.apache.santuario.xmlsec 模块) org.jcp.xml.dsig.internal.dom.DOMReference 位于 xmlsec-1.4.3.jar(依赖于您的 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 对象时,您有 class 转换异常。

您可以通过不同的方式解决您的问题:

  • 删除 jboss-deployment-structure.xml 中 org.apache.santuario.xmlsec 模块的依赖。应用程序将使用自己定义的 xmlsec-1.4.3 库
  • 在 pom.xml 中找到依赖项 xmlsec,将版本设置为 1.5.1,并将范围设置为 provided。应用程序将使用 JBoss 模块和 xmlsec-1.5.1
  • 在 pom.xml 中找到依赖项 xmlsec 并完全排除它,如果你的代码没有 xmlsec 依赖项。应用程序将使用 JBoss 模块和 xmlsec-1.5.1

mvn:dependency:tree 命令在这里有帮助。