我收到此错误:
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>
你有什么迹象吗?
提前致谢。
答案 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对象时,您会遇到类强制转换异常。
您可以通过不同方式解决问题:
org.apache.santuario.xmlsec
模块的依赖关系。应用程序将使用他自己定义的xmlsec-1.4.3库xmlsec
,将版本设置为1.5.1,并将范围设置为provided
。应用程序将使用JBoss模块和xmlsec-1.5.1 xmlsec
并完全排除它,如果您的代码符合xmlsec
依赖项。应用程序将使用JBoss模块和xmlsec-1.5.1 mvn:dependency:tree
命令可以帮到这里。