50.2. 使用 WebApplicationException 例外报告

            errors
indexterm:[WebApplicationException]

概述

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

创建一个简单的例外

创建 WebApplicationException 异常的最简单方法是使用 no argument constructor 或 constructor 将原始异常嵌套在 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.Throwable会导致javax.ws.rs.core.Response.Status状态

丢弃其中一个构造器创建的异常时,运行时会返回一个空实体正文和指定状态代码的响应。

提供实体正文

如果您希望消息与例外一起发送,您可以使用一个使用 Response 对象的 WebApplicationException 构造器之一。运行时使用 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 “扩展 WebApplicationException” 显示与 例 50.3 “发送消息异常” 中代码类似的响应的新例外。

例 50.4. 扩展 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.");