50.2. 使用 WebApplicationException 异常报告


            errors
indexterm:[WebApplicationException]

概述

JAX-RS API 引入了 WebApplicationException 运行时异常,为资源方法提供简单方法,可以创建适合 RESTful 客户端使用的异常。WebApplicationException 例外可以包括定义实体正文的 Response 对象,以返回到请求的原始器。它还提供了指定要在不提供实体正文时返回到客户端的 HTTP 状态代码的机制。

创建一个简单的例外

创建 WebApplicationException 异常的最简单方法是使用 no 参数构造器,或将原始异常嵌套在 WebApplicationException 异常中。这两个构造器都会创建一个带有空响应的 WebApplicationException。

当抛出这些构造器之一创建的异常时,运行时会返回带有空实体正文和状态代码 500 Server Error 的响应。

设置返回到客户端的状态代码

当您要返回 500 以外的错误代码时,您可以使用四个 WebApplicationException 结构器之一来指定状态。例 50.1 “创建具有状态代码的 WebApplicationException” 中显示的两个构造器将返回状态取为整数。

例 50.1. 创建具有状态代码的 WebApplicationException

WebApplicationExceptionintstatusWebApplicationExceptionjava.lang.Throwablecauseintstatus

例 50.2 “创建具有状态代码的 WebApplicationException” 中显示的另一个是响应状态,作为 Response.Status 实例。

例 50.2. 创建具有状态代码的 WebApplicationException

WebApplicationExceptionjavax.ws.rs.core.Response.StatusstatusWebApplicationExceptionjava.lang.Throwablecausejavax.ws.rs.core.Response.Statusstatus

当抛出这些构造器之一创建的异常时,运行时会返回带有空实体正文和指定状态代码的响应。

提供实体正文

如果您希望发送消息并附带异常,您可以使用其中一个 WebApplicationException 结构器采用 Response 对象。运行时使用 Response 对象来创建发送到客户端的响应。响应中存储的实体映射到消息的实体正文,并且响应的 status 字段映射到消息的 HTTP 状态。

例 50.3 “发送一条例外信息” 显示向包含例外原因的客户端返回文本消息的代码,并将 HTTP 消息状态设置为 409 Conflict

例 50.3. 发送一条例外信息

import javax.ws.rs.core.Response;
import javax.ws.rs.WebApplicationException;
import org.apache.cxf.jaxrs.impl.ResponseBuilderImpl;

...
ResponseBuilderImpl builder = new ResponseBuilderImpl();
builder.status(Response.Status.CONFLICT);
builder.entity("The requested resource is conflicted.");
Response response = builder.build();
throw WebApplicationException(response);

扩展通用异常

可以扩展 WebApplicationException 异常。这样,您可以创建自定义异常并消除一些样板代码。

例 50.4 “Extending WebApplicationException” 显示一个新的异常,它会创建一个与 例 50.3 “发送一条例外信息” 中代码类似的响应。

例 50.4. Extending WebApplicationException

public class ConflicteddException extends WebApplicationException
{
  public ConflictedException(String message)
  {
    ResponseBuilderImpl builder = new ResponseBuilderImpl();
    builder.status(Response.Status.CONFLICT);
    builder.entity(message);
    super(builder.build());
     }
}

...
throw ConflictedException("The requested resource is conflicted.");
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.