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

时间:2015-10-28 13:54:11

标签: java java-ee jboss jboss7.x pom.xml

我收到此错误:

  

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>

你有什么迹象吗?

提前致谢。

1 个答案:

答案 0 :(得分:3)

您的问题是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类加载器之间传递DOMReference对象时,您会遇到类强制转换异常。

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

  • 删除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命令可以帮到这里。