我们的系统使用基于服务的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。 Hovewer我需要获取SOAP fault的faultcode,它只能使用SOAPFaultException方法从getFaultCode检索。你能不能告诉我如何在上面提到的自定义故障异常中找到SOAPFaultException或SOAP fault的faultcode? p>
答案 0 :(得分:9)
您可以实现JAX-WS handler并将其添加到客户端Web服务引用中。这将有机会处理请求消息和响应消息或通知故障。
创建SOAPHandler<SOAPMessageContext>
,您的handleFault()
方法将通过SOAPMessageContext
。您可以getMessage().getSOAPBody().getFault()
获取SOAPFault
,其中包含getFaultCode()
和getDetail()
。
将新的错误处理程序分配给您的Web服务引用。一种方法是通过@HandlerChain
。它将在您的catch
子句之前调用。