Apache CXF 客户端 SOAP 错误处理



我正在一个独立的java应用程序中使用apache cxf客户端3.2.2来调用一些soap web服务。

尝试在单向操作中获取 soap 故障代码和故障字符串,但没有成功。

我已经定义了一个自定义拦截器,但它从未到达句柄消息

IncomingFaultInterceptor faultInterceptor = new IncomingFaultInterceptor();
cxfEndpoint.getInFaultInterceptors().add(faultInterceptor);

来自自定义侦听器的代码

public class IncomingFaultInterceptor extends AbstractSoapInterceptor {
public IncomingFaultInterceptor(){
super(Phase.RECEIVE);
}

@Override
public void handleMessage(SoapMessage message) throws Fault {
if(message != null){
/* log fault string , fault code*/ 
}

}

}

我得到的异常是在MessageSenderEndingInterceptor(处于PREPARE_SEND阶段)。

它抛出一个新的错误,文本为"无法发送消息"。 奇怪的是,捕获的异常是"与..." 通信时 HTTP 响应'500:内部服务器错误'......">

如果我使用 soapui 发送相同的请求,我会看到错误代码和错误字符串

HTTP/1.1 500 Internal Server Error
Accept: text/xml, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
SOAPAction: ""
Content-Type: text/xml;charset=utf-8
Content-Length: 396
Date: Thu, 05 Apr 2018 15:32:27 GMT
Connection: close
Server: Test
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode xmlns:ns0="http://company.com/services/fault">THE_FAULT_CODE</faultcode>
<faultstring xml:lang="en">THE_FAULT_STRING</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

任何想法,或者我该怎么做才能获得故障代码和错误字符串?cxf 中客户端拦截器的任何良好文档?

更新:

似乎无法使用 cxf 客户端的单向操作获取故障代码和错误字符串,因为服务器不符合 SOAP 和 WSI 标准。

无论如何,我无法绕过异常并记录错误字符串和错误代码。尝试在生成的代码中注释单向注释,但拦截器仍然从未执行。 我找不到有关如何在客户端实现拦截器来处理错误的好示例。

更多信息:

单向操作的 WS-I 规范。 从定义".例如,在这种情况下,无法返回包含错误的"500 内部服务器错误"HTTP 响应。

除此之外,错误"无法发送消息"非常令人困惑,因为请求已发送,但此处已经报告

不明白为什么要制作自己的拦截器。

看这里: http://cxf.apache.org/docs/developing-a-consumer.html

如果在 WSDL 中显式描述错误,则会生成错误类,您可以捕获它。

您可以在此处指定错误消息。

<wsdl:operation name="pingMe">
<wsdl:input name="pingMeRequest" message="tns:pingMeRequest"/>
<wsdl:output name="pingMeResponse" message="tns:pingMeResponse"/>
<wsdl:fault name="pingMeFault" message="tns:pingMeFault"/>
</wsdl:operation> 
<wsdl:message name="pingMeFault">
<wsdl:part name="faultDetail" element="x1:faultDetail"/>
</wsdl:message>

最新更新