30.2. 协议故障

概述

当请求处理过程中出错时,会抛出协议异常。所有同步的远程调用可能会抛出协议异常。根本原因可以在消费者的消息处理链或服务提供商中实现。

JAX-WS 规范定义了一个通用协议例外。它还指定 SOAP 特定的协议异常和特定于 HTTP 的协议例外。

协议例外的类型

JAX-WS 规范定义三种类型的协议异常。您捕获的异常依赖于应用程序使用的传输和绑定。

表 30.2 “通用协议例外的类型” 描述三种协议类型,以及何时抛出。

表 30.2. 通用协议例外的类型

例外类Thrown

javax.xml.ws.ProtocolException

这个例外是通用协议异常。无论使用的协议是什么,都很难发现它。如果您使用 SOAP 绑定或 HTTP 绑定,它可以转换为特定的故障类型。将 XML 绑定与 HTTP 或 JMS 传输结合使用时,无法将通用协议异常转换为更具体的故障类型。

javax.xml.ws.soap.SOAPFaultException

使用 SOAP 绑定时,远程调用会抛出这个异常。更多信息请参阅 “使用 SOAP 协议例外”一节

javax.xml.ws.http.HTTPException

使用 Apache CXF HTTP 绑定来开发 RESTful Web 服务时会抛出这个异常。更多信息请参阅 第 VI 部分 “开发 RESTful Web 服务”

使用 SOAP 协议例外

SOAPFaultException 异常嵌套 SOAP 错误。底层 SOAP 错误作为 javax.xml.SOAPFault 对象存储在 fault 字段中。

如果服务实施需要引发异常,它不适用于应用程序创建的任何自定义例外,它可以使用例外创建者将错误嵌套在 SOAPFaultException 中,并将其退回给消费者。例 30.1 “抛出 SOAP 协议例外” 显示在传递方法时用于创建和抛出 SOAPFaultException 的代码。

例 30.1. 抛出 SOAP 协议例外

public Quote getQuote(String ticker)
{
  ...
  if(tickers.length()<3)
  {
    SOAPFault fault = SOAPFactory.newInstance().createFault();
    fault.setFaultString("Ticker too short");
    throw new SOAPFaultException(fault);
  }
  ...
}

当消费者捕获 SOAPFaultException 异常时,他们可以通过检查嵌套的 SOAPFault 异常来检索异常。如 例 30.2 “从 SOAP 协议例外获取故障” 所示,使用 SOAPFaultException 异常来检索 SOAPFaultException 异常的 getFault() 方法。

例 30.2. 从 SOAP 协议例外获取故障

...
try
{
  proxy.getQuote(ticker);
}
catch (SOAPFaultException sfe)
{
  SOAPFault fault = sfe.getFault();
  ...
}