如何在处理自定义故障异常时获取SOAP故障的故障代码

10
我们的系统使用基于服务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故障的faultcode,这只能通过使用getFaultCode方法从SOAPFaultException中检索。请问我该如何在捕获上述自定义错误异常的地方访问SOAPFaultException或SOAP故障的faultcode呢?


你没有直接访问返回的SOAPMessage吗? - vishnu viswanath
没有。我只是抛出了异常,该异常在我的代码中被捕获。 - Nikoloz
1个回答

11
您可以实现一个 JAX-WS handler,并将其添加到您的客户端 Web 服务引用中。这将有机会处理请求消息和响应消息,或者通知故障。创建一个 SOAPHandler<SOAPMessageContext> 并且您的 handleFault() 方法将传递 SOAPMessageContext。从那里,您可以使用 getMessage().getSOAPBody().getFault() 获取包含 getFaultCode()getDetail()SOAPFault。将新故障处理程序分配给您的 Web 服务引用。一种方法是通过 @HandlerChain。它将在您的 catch 子句之前调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接