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
WebApplicationException
int
status
WebApplicationException
java.lang.Throwable
cause
int
status
例 50.2 “创建具有状态代码的 WebApplicationException” 中显示的另一个是响应状态,作为 Response.Status
实例。
例 50.2. 创建具有状态代码的 WebApplicationException
WebApplicationException
javax.ws.rs.core.Response.Status
status
WebApplicationException
java.lang.Throwable
cause
javax.ws.rs.core.Response.Status
status
当抛出这些构造器之一创建的异常时,运行时会返回带有空实体正文和指定状态代码的响应。
提供实体正文
如果您希望发送消息并附带异常,您可以使用其中一个 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 “扩展 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.");