2013-11-20 89 views
8

我們的系統使用基於服務的WSDL生成的JAX-WS客戶端存根控件來使用SOAP Web服務。在錯誤的服務器的情況下返回SOAP錯誤是這樣的:如何在處理自定義故障異常時獲取SOAP故障的錯誤代碼

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header /> 
    <s:Body> 
    <s:Fault> 
     <faultcode>SomeErrorCode</faultcode> 
     <faultstring xml:lang="en-US">Some error message</faultstring> 
     <detail> 
     <ApiFault xmlns="http://somenamespace.com/v1.0" xmlns:a="http://somenamespace.com/v1.0" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
      <a:RequestId>123456789</a:RequestId> 
      <a:CanRetry>true</a:CanRetry> 
     </ApiFault> 
     </detail> 
    </s:Fault> 
    </s:Body> 

基於WSDL SomeCustomFault異常類生成和所有的服務方法都聲明瞭這一點(見下文)例外。

@WebFault(name = "ApiFault", targetNamespace = "http://services.altasoft.ge/orders/v1.0") 
public class SomeCustomFault 
    extends Exception 
{ 
    private ApiFault faultInfo; 

    public SomeCustomFault(String message, ApiFault faultInfo) { 
     super(message); 
     this.faultInfo = faultInfo; 
    } 

    public SomeCustomFault(String message, ApiFault faultInfo, Throwable cause) { 
     super(message, cause); 
     this.faultInfo = faultInfo; 
    } 

    public ApiFault getFaultInfo() { 
     return faultInfo; 
    } 
} 

正如你可以看到這個定製的故障異常延伸Exception而不是SOAPFaultException。 Hovewer我需要獲取SOAP故障的錯誤代碼,可以使用getFaultCode方法從SOAPFaultException中檢索。你能告訴我怎樣才能達到SOAPFaultException或SOAP故障的錯誤代碼在哪裏我趕上上面提到的自定義錯誤異常?

+0

您沒有權限訪問返回的SOAPMessage嗎? –

+0

不,我只拋出了我的代碼中發現的異常 – Nikoloz

回答

9

您可以實現JAX-WS handler並將其添加到您的客戶端Web服務引用。這將有機會處理請求消息和響應消息或通知故障。

創建一個SOAPHandler<SOAPMessageContext>並且您的handleFault()方法將通過SOAPMessageContext。從那裏你可以getMessage().getSOAPBody().getFault()得到SOAPFault,其中包含getFaultCode()getDetail()

將新的故障處理程序分配給您的Web服務參考。一種方法是通過@HandlerChain。它將在您的catch條款之前被調用。