我正在使用 CXF 2.6.2 从外部系统访问 Web 服务。 stub 是从 WSDL 文件生成的。当网络服务正确响应时,这可以正常工作,但在故障情况下则不行。
然后我得到以下异常:
Caused by: org.w3c.dom.DOMException: Operation not supported on this type of node: [ExceptionDetail: null] at org.jboss.ws.core.soap.NodeImpl.convertDOMNode(NodeImpl.java:557) at org.jboss.ws.core.soap.NodeImpl.appendChild(NodeImpl.java:459) at org.apache.cxf.jaxws.JaxWsClientProxy.createSoapFault(JaxWsClientProxy.java:234) at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:152)
我从网络服务得到的实际响应是:
ID: 6
Response-Code: 500
Encoding: UTF-8
Content-Type: text/xml; charset=utf-8
Headers: {Content-Length=[1925], content-type=[text/xml; charset=utf-8], Date=[Wed, 16 Oct 2013 05:40:21 GMT], Persistent-Auth=[true], Server=[Microsoft-IIS/7.5], X-Powered-By=[ASP.NET]}
Payload:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body><s:Fault>
<faultcode xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:InternalServiceFault</faultcode>
<faultstring xml:lang="en-US">External Exception Message</faultstring>
<detail><ExceptionDetail xmlns="http://schemas.datacontract.org/2004/07/System.ServiceModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><HelpLink i:nil="true"/><InnerException i:nil="true"/><Message>External Exception Message</Message><StackTrace>...stacktrace from external system...</StackTrace><Type>XXXException</Type></ExceptionDetail></detail>
</s:Fault></s:Body>
</s:Envelope>
所以我的问题是如何使用 CXF 正确处理 SOAP 故障?我需要的是从响应中取出错误字符串。
当然可以解析返回的消息,但是这样会很麻烦。
我已经注册了一个自己的拦截器(扩展AbstractSoapInerceptor),它获取返回的soapmessage,但该消息仅包含带有响应的输入流,并且似乎无法识别内部的XML。
谢谢
最佳答案
问题已解决。经过更详细的调试,我发现问题实际上是由我使用 CXF 实现的 JBoss 4.2.3 引起的。
由于某种原因,JBoss WS 参与了该过程,并且无法解析错误消息的详细标记。删除详细信息标记后,我遇到了下一个异常:org.jboss.ws.core.soap.SOAPFaultElementImpl 的实例化异常。 这个类实际上不在我的类路径中,因为我认为我不需要使用 jbossws。现在我已经将其包含在内,一切都按预期工作!
关于java - 如何在CXF中处理来自外部系统的SOAP故障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19396324/