1

我正在使用 CXF 2.6.2 从外部系统访问 Web 服务。存根是从 WSDL 文件生成的。当网络服务正确响应时,这可以正常工作,但在故障情况下则不行。

然后我得到以下异常:

原因:org.w3c.dom.DOMException:这种类型的节点不支持操作:[ExceptionDetail: null] at org.jboss.ws.core.soap.NodeImpl.convertDOMNode(NodeImpl.java:557) at 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 正确处理肥皂故障?我需要的是从响应中获取故障字符串。

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

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

谢谢

4

1 回答 1

1

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

出于某种原因,JBoss WS 参与了这个过程,这个过程无法通过错误消息的详细标签。删除详细标签后,我遇到了下一个异常:org.jboss.ws.core.soap.SOAPFaultElementImpl 的实例化异常。这个类实际上不在我的类路径中,因为我认为我不需要使用 jbossws。现在我已经包含了它,一切都按预期工作!

于 2013-10-16T13:18:22.863 回答