从 IBM WebSphere 8.5 迁移到 JBoss EAP 7.0 - SOAP 请求解析失败,“ElementNSImpl 无法转换为 javax.xml.soap.SOAPElement”

问题描述

代码在部署到 IBM Web Sphere 和 Tomcat 时工作正常,但在部署到 JBoss 后,无法解析 SOAP 请求并出现异常:“ElementNSImpl cannot be cast to javax.xml.soap.SOAPElement”

我没有使用 apache.xerces,但 JBoss 正在使用它来解析 XML。我试图从 JBoss 中删除它,但它看起来是 JBoss 本身的必要部分,不能排除。有什么建议吗?

这是基于从 JBoss 日志中提取的 HTTP 转储的示例 SOAP 请求。标题/正文中没有添加任何内容。与请求发送相同。

Payload: <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ws="http://ws.abc.abcdef/">
   <soap:Header>
      <wsse:Security soap:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
         <wsse:UsernameToken>
            <wsse:Username>admin</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">AES:MEff87/VBtZJIz4jJpJKN7Q2+qweqweqweqeqewqwe</wsse:Password>
         </wsse:UsernameToken>
      </wsse:Security>
   </soap:Header>
   <soap:Body>
        ....
        ....
   </soap:Body>
</soap:Envelope>

代码如下:

@GrailsCxfEndpoint(expose = EndpointType.JAX_WS,soap12 = true)
class className {
....
....
    @WebMethod
    @WebResult(name = "result")
    TokenResponse methodName(
        @WebParam(name = "XXXXX") String XXXXX,....
        ....
        @WebParam(name = "response") String response) {

        def soapMessage = PhaseInterceptorChain.getCurrentMessage()
        def adminUsername = userService.getSoapHeaderInfoByLocalName(soapMessage,USERNAME)
        ...
        ...

这里是例外:

2021-04-30 02:18:40,658 WARN  [org.apache.cxf.phase.PhaseInterceptorChain] (default task-1) Interceptor for {http://ws.abc.abcdef/}SampleEndpointService has thrown exception,unwinding now: java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.ElementNSImpl cannot be cast to javax.xml.soap.SOAPElement
        at org.apache.cxf.binding.soap.saaj.SAAJStreamWriter.adjustOverlaidNode(SAAJStreamWriter.java:67)
        at org.apache.cxf.staxutils.OverlayW3CDOMStreamWriter.writeStartElement(OverlayW3CDOMStreamWriter.java:192)
        at org.apache.cxf.staxutils.StaxUtils.writeStartElement(StaxUtils.java:814)
        at org.apache.cxf.staxutils.StaxUtils.copy(StaxUtils.java:741)
        at org.apache.cxf.staxutils.StaxUtils.copy(StaxUtils.java:705)
        at org.apache.cxf.staxutils.StaxUtils.copy(StaxUtils.java:649)
        at org.apache.cxf.binding.soap.saaj.SAAJInInterceptor.handleMessage(SAAJInInterceptor.java:193)
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.getSOAPMessage(WSS4JInInterceptor.java:155)
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessageInternal(WSS4JInInterceptor.java:222)
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:190)
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:96)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
        at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
        at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:251)
        at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)
        at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)
        at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)
        at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:171)
        at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:293)
        at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:212)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:523)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)