java - Apache CXF 客户端 soap 故障处理

标签 java web-services soap cxf cxf-client

我在独立的 Java 应用程序中使用 apache cxf 客户端 3.2.2 来调用一些 soap 网络服务。

尝试在 one way operation 中获取 soap 故障代码和故障字符串但没有成功。

我定义了一个自定义拦截器,但它从未到达 handleMessage

 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 response '500: Internal Server Error' when communicating with ...”

如果我用 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 中客户端拦截器的任何好的文档?

更新:

似乎无法在 one way operation 中获取故障代码和故障字符串以cxf客户端为服务端不符合SOAP和WSI标准。

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

更多信息:

WS-I for one way operations的规范. 根据定义“..例如,在这种情况下无法返回包含故障的“500 Internal Server Error”HTTP 响应。”

除此之外,“Could not send message”错误非常令人困惑,因为已发送请求但已报告 here

最佳答案

不明白为什么要自己做拦截器。

看这里: 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>

关于java - Apache CXF 客户端 soap 故障处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49677937/

相关文章:

java - OpenCV Android Java VideoCapture 构造函数不接受字符串

java - Java中的状态栏

java - Eclipse 中数组的默认详细信息格式化程序

web-services - 使用 Web 服务将 Scorm 文件上传到 Moodle 中的类(class)

jquery - jQuery 验证插件问题(远程验证)

通过 https 调用 PHP Soap

java - Intellij IDEA 无法从 JAVA 生成 WSDL

c# - 在 .Net 3.5 Web 项目中使用 HTTPS Web 服务

java - 使用 Javascript 和 Java 验证图像上传

java - 从您的 JSF 代码调用 Web 服务