如何在CXF中处理来自外部系统的SOAP故障?

时间:2013-10-16 06:08:10

标签: java web-services soap cxf

我正在使用CXF 2.6.2从外部系统访问Web服务。存根是从WSDL文件生成的。当websevice正确响应时,这种方法很好,但不是在故障情况下。

然后我得到以下异常:

  

引起:org.w3c.dom.DOMException:此类型的节点不支持该操作:[ExceptionDetail:null]       在org.jboss.ws.core.soap.NodeImpl.convertDOMNode(NodeImpl.java:557)       在org.jboss.ws.core.soap.NodeImpl.appendChild(NodeImpl.java:459)       在org.apache.cxf.jaxws.JaxWsClientProxy.createSoapFault(JaxWsClientProxy.java:234)       在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正确处理soapfaults?我需要的是从响应中获取faulttring。

当然我可以解析返回的消息,但这会非常麻烦。

我已经注册了一个自己的拦截器(扩展AbstractSoapInerceptor),它获取了返回的soapmessage,但是该消息只包含一个带有响应的输入流,似乎无法识别内部的XML。

由于

1 个答案:

答案 0 :(得分:1)

问题解决了。经过更详细的调试后,我发现问题实际上是由我正在使用CXF实现的JBoss 4.2.3引起的。

由于某种原因,JBoss WS参与了这个过程,而且这个人无法解析故障消息的详细标签。删除详细信息标记后,我将在下一个异常中进行操作:org.jboss.ws.core.soap.SOAPFaultElementImpl的实例化异常。 这个类实际上不在我的类路径中,因为我认为我不需要使用jbossws。现在我已经把它包括在内了,一切都按预期工作了!