java - JAX-RS/Jersey 如何自定义错误处理?

标签 java rest error-handling jersey jax-rs

我正在使用 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 的实例。只要您不必实现自己的应用程序异常,这种方法就可以工作。

例子:

@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 接口(interface),并用 @Provider注释。这告诉 JAX-RS 运行时,如果引发了包装的异常,则返回 ExceptionMapper 中定义的响应代码。

关于java - JAX-RS/Jersey 如何自定义错误处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/583973/

相关文章:

node.js - 当未捕获错误时, Node : async. foreach 会默默失败,抛出异常

java - 如何用不断变化的tableModel来刷新JTable?

java - Netty 4 中的阻塞

java - 创建容器时附加 docker_

java - 如何在 Spring MVC 中回滚 Web 服务

javascript - 抛出新错误(字符串)未在 F12 中显示

vb.net - 我想在调用函数返回错误时控制错误消息

java - 有什么方法可以在 JPA 或 Spring-data 中设置默认外键吗?

api - 什么应该位于 REST API 的主页上?

java - 预计还有 1 项未满足的期望。执行了 0 个请求