我正在使用Jersey学习JAX-RS(又名JSR-311).我已经成功地创建了根资源,并且正在try 参数:

@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
    }
}

这非常有效,可以处理日期(字符串)构造函数可以理解的当前语言环境中的任何格式(如YYYY/mm/dd和mm/dd/YYYY).但是,如果我提供的值无效或无法理解,我会得到404响应.

例如:

GET /hello?name=Mark&birthDate=X

404 Not Found

如何定制这种行为?可能是不同的响应代码(可能是"400错误请求")?记录一个错误怎么样?也许可以在自定义标题中添加问题描述("错误日期格式"),以帮助进行故障排除?或者返回一个完整的错误响应和详细信息,以及5xx状态码?

推荐答案

有几种方法可以定制JAX-RS的错误处理行为.

第一种方法是创建一个扩展WebApplicationException的异常类.

例子:

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,该包装器类实现了用@Provider注释标注的ExceptionMapper接口.这告诉JAX-RS运行时,如果引发包装异常,则返回ExceptionMapper中定义的响应代码.

Java相关问答推荐

如何跟踪我在数组中的位置

如何让HikariCP指标在NewRelic中正确显示?

所有 case 一起输入时输出错误,而单独放置时输出正确

存根基类的受保护方法

相同的Java SerializedLambda为implMethodKind返回不同的结果

更新GWT 2.5.1到2.11.0和sencha GXT 3.1.1到4.1时出现错误

如何正确创建序列图?

无法使用ApacheSpark依赖项构建JavaFX应用程序

为什么Spring Boot项目无法为基于MySQL的CRUD应用程序找到从JPARepository接口扩展的ProductRepository?

Java ArrayList的整数和数组的泛型

如何为JavaFX Spring Boot应用程序制作Windows/MacOS/Linux安装程序

Lombok@Nonnull是否也对供应商有影响?

无法将GSON导入到我的JavaFX Maven项目

将stringBuilder + forloop转换为stream + map

Java在操作多个属性和锁定锁对象时使用同步和易失性

具有最大共同前景像素的图像平移优化算法

Oracle中从JSON中提取和插入数据

Java List有一个在一个位置添加多个元素的方法,但我找不到一个在一个位置删除多个元素的方法

Intellij 2023 IDE:始终在顶部显示菜单栏

可以';不要在Intellij IDEA中使用最新的Java版本(JDK 21)