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
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
会导致
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.");