问题描述
代码在部署到 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 (将#修改为@)