我正在使用 Jersey 学习 JAX-RS(又名 JSR-311)。我已经成功创建了一个根资源并正在使用参数:
@Path("/hello") public class HelloWorldResource { @GET @Produces("text/html") public String get( @QueryParam("name") String name, @QueryParam("birthDate") Date birthDate) { // Return a greeting with the name and age } }
这很好用,并且可以处理 Date(String) 构造函数理解的当前语言环境中的任何格式(如 YYYY/mm/dd 和 mm/dd/YYYY)。但是,如果我提供的值无效或无法理解,我会收到 404 响应。
例如:
GET /hello?name=Mark&birthDate=X 404 Not Found
如何自定义此行为?也许是不同的响应代码(可能是“400 Bad Request”)?记录错误怎么办?也许在自定义标题中添加问题描述(“错误的日期格式”)以帮助故障排除?还是返回带有详细信息的完整错误响应以及 5xx 状态代码?
有几种方法可以使用 JAX-RS 自定义错误处理行为。以下是三种更简单的方法。
第一种方法是创建一个扩展 WebApplicationException 的 Exception 类。
例子:
public class NotAuthorizedException extends WebApplicationException { public NotAuthorizedException(String message) { super(Response.status(Response.Status.UNAUTHORIZED) .entity(message).type(MediaType.TEXT_PLAIN).build()); } }
要抛出这个新创建的异常,您只需:
@Path("accounts/{accountId}/") public Item getItem(@PathParam("accountId") String accountId) { // An unauthorized user tries to enter throw new NotAuthorizedException("You Don't Have Permission"); }
请注意,您不需要在 throws 子句中声明异常,因为 WebApplicationException 是运行时异常。这将向客户端返回 401 响应。
第二种更简单的方法是 WebApplicationException直接在代码中简单地构造一个实例。只要您不必实现自己的应用程序异常,这种方法就可以工作。
WebApplicationException
@Path("accounts/{accountId}/") public Item getItem(@PathParam("accountId") String accountId) { // An unauthorized user tries to enter throw new WebApplicationException(Response.Status.UNAUTHORIZED); }
此代码也向客户端返回 401。
当然,这只是一个简单的例子。如有必要,您可以使异常更加复杂,并且可以生成所需的任何 http 响应代码。
另一种方法是包装现有的异常,可能是ObjectNotFoundException一个小的包装类,该类实现ExceptionMapper带有@Provider注释的接口。这告诉 JAX-RS 运行时,如果引发了包装的异常,则返回在ExceptionMapper.
ObjectNotFoundException
ExceptionMapper
@Provider