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
命令在这里有帮助。
我收到这个错误:
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
命令在这里有帮助。