Как получить faultcode ошибки SOAP при обработке пользовательского исключения ошибки

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

1 ответов


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

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

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