30.2. 协议故障
概述
当处理请求过程中发生错误时,会抛出协议异常。所有同步远程调用可能会抛出协议异常。根本原因是在消费者的消息处理链或服务提供商中发生。
JAX-WS 规范定义了通用协议异常。它还指定特定于 SOAP 的协议异常和特定于 HTTP 的协议异常。
协议例外的类型
JAX-WS 规范定义了三种类型的协议异常。哪个例外情况取决于应用程序使用的传输和绑定。
表 30.2 “通用协议例外的类型” 描述三种类型的协议异常,以及何时抛出。
例外类 | 星期三 |
---|---|
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.soap.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 异常的 getFault ()
方法检索 SOAPFault 异常。
例 30.2. 从 SOAP 协议例外获取故障
...
try
{
proxy.getQuote(ticker);
}
catch (SOAPFaultException sfe)
{
SOAPFault fault = sfe.getFault();
...
}