30.2. 协议故障


概述

当处理请求期间出现错误时,会抛出协议例外。所有同步远程调用都可以抛出协议异常。造成底层的原因在消费者的消息处理链或服务提供商中发生。

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

协议例外的类型

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

表 30.2 “Generic Protocol Exceptions 的类型” 描述三种协议异常以及何时抛出。

表 30.2. Generic Protocol Exceptions 的类型
例外类别chhrown 的时间

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 协议例外获取故障” 所示,SOAPFault 异常使用 SOAPFaultException 异常的 getFault () 方法检索。

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

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

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.