我收到此错误:
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对象时,您具有类强制转换异常。
您可以通过多种方式解决问题:
org.apache.santuario.xmlsec
模块的依赖性。应用程序将使用他自己定义的xmlsec-1.4.3库xmlsec
,将version设置为1.5.1,并将scope设置为provided
。应用程序将使用JBoss模块和xmlsec-1.5.1 xmlsec
并完全排除它(如果您的代码符合没有xmlsec
依赖项)。应用程序将使用JBoss模块和xmlsec-1.5.1 mvn:dependency:tree
命令在这里有帮助。