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.Throwablecauseint状态

例 50.2 “使用状态代码创建 WebApplicationException” 所示的另一个两个响应状态作为 Response.Status 实例。

例 50.2. 使用状态代码创建 WebApplicationException

WebApplicationExceptionjavax.ws.rs.core.Response.StatusstatusWebApplicationExceptionjava.lang.Throwablecausejavax.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.");