2013-11-20 2 views
8

Наша система использует веб-службу SOAP с использованием клипов JAX-WS, созданных на основе WSDL службы. В случае ошибки сервера возвращает ошибки 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, который можно получить только с SOAPFaultException с использованием метода getFaultCode. Не могли бы вы рассказать мне, как я могу достичь SOAPFaultException или код ошибки неисправности SOAP на месте, где я поймаю вышеупомянутое исключение пользовательской ошибки?

+0

У вас нет доступа к возвращенному SOAPMessage как таковому? –

+0

Нет. Я только исключил исключение, которое попало в мой код – Nikoloz

ответ

9

Вы можете реализовать JAX-WS handler и добавить его в ссылку на веб-службу своего клиента. Это даст возможность обрабатывать сообщение запроса и ответное сообщение или уведомлять о неисправности.

Создайте SOAPHandler<SOAPMessageContext> и ваш метод handleFault() будет передан SOAPMessageContext. Из этого вы можете getMessage().getSOAPBody().getFault() получить SOAPFault, который содержит getFaultCode() и getDetail().

Назначьте нового обработчика ошибок на веб-службу ref. Один из способов - через @HandlerChain. Он будет использоваться до вашего предложения catch.

Смежные вопросы