2013-11-20 31 views
8

Hệ thống của chúng tôi tiêu thụ Dịch vụ Web SOAP, sử dụng các sơ đồ khách JAX-WS được tạo dựa trên WSDL của dịch vụ. Trong trường hợp máy chủ lỗi trả về lỗi SOAP như thế này:Cách nhận mã lỗi của lỗi SOAP khi xử lý lỗi ngoại lệ tùy chỉnh

<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> 

Dựa trên WSDL SomeCustomFault lớp ngoại lệ được tạo ra và tất cả các phương pháp dịch vụ được khai báo để ném này (xem dưới đây) là ngoại lệ.

@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; 
    } 
} 

Như bạn có thể thấy điều này ngoại lệ lỗi tùy chỉnh mở rộng Exception và không SOAPFaultException. Hovewer tôi cần phải nhận được lỗi của lỗi SOAP mà có thể được lấy ra chỉ từ SOAPFaultException sử dụng phương pháp getFaultCode. Bạn có thể cho tôi biết làm thế nào tôi có thể đạt được mã lỗi SOAPFaultException hoặc SOAP lỗi tại nơi tôi bắt ở trên ngoại lệ lỗi tùy chỉnh được đề cập?

+0

bạn không có quyền truy cập vào SOAPMessage được trả về như vậy không? –

+0

No. Tôi chỉ ném ngoại lệ bị bắt trong mã của tôi – Nikoloz

Trả lời

9

Bạn có thể triển khai JAX-WS handler và thêm nó vào tham chiếu dịch vụ web của khách hàng của bạn. Điều này sẽ có cơ hội để xử lý tin nhắn yêu cầu và tin nhắn phản hồi HOẶC thông báo lỗi.

Tạo một SOAPHandler<SOAPMessageContext> và phương pháp handleFault() của bạn sẽ được chuyển qua SOAPMessageContext. Từ đó bạn có thể getMessage().getSOAPBody().getFault() để nhận được SOAPFault, trong đó có getFaultCode()getDetail().

Chỉ định trình xử lý lỗi mới cho dịch vụ web của bạn. Một chiều là qua @HandlerChain. Nó sẽ được gọi trước mệnh đề catch của bạn.

Các vấn đề liên quan