簡體   English   中英

Apache CXF客戶端soap故障處理

[英]Apache CXF client soap fault handling

我在一個獨立的Java應用程序中使用apache cxf client 3.2.2來調用某些soap webservices。

嘗試以單向操作獲取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響應'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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM