9

我们的系统使用基于服务的 WSDL 生成的 JAX-WS 客户端存根来使用 SOAP Web 服务。如果出现错误,服务器会返回如下 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。但是,我需要获取 SOAP 错误的错误代码,该错误代码只能使用getFaultCode方法从SOAPFaultException中检索。您能告诉我如何在捕获上述自定义错误异常的地方找到SOAPFaultException或 SOAP 错误的错误代码吗?

4

1 回答 1

10

您可以实现一个 JAX-WS处理程序并将其添加到您的客户端 Web 服务引用中。这将有机会处理请求消息和响应消息或通知故障。

创建一个SOAPHandler<SOAPMessageContext>,您的handleFault()方法将通过SOAPMessageContext. 从那里你可以getMessage().getSOAPBody().getFault()得到SOAPFault, 其中包含getFaultCode()getDetail()

将您的新故障处理程序分配给您的 Web 服务参考。一种方法是通过@HandlerChain. 它将在您的catch条款之前被调用。

于 2014-03-23T02:26:59.103 回答