相同的ExceptionMapper用于不同的异常

Ped*_*ñez 6 java rest jersey

我的应用程序提供RESTful接口来执行某些操作.我使用ExceptionMapper捕捉象异常NoResultExceptionEntityNotFoundException然后返回404状态码,或类似的异常NumberFormatExceptionConstraintViolationException并返回400的状态码...等等.

我的问题是,ExceptionMapper每次只允许我选择一种例外; 所以我不能对所有错误400使用相同的类,而其他形式的所有错误404.

有没有办法创建一个ExceptionMapper映射两种不同类型的异常?

我的另一个选择是更改我的函数以返回一个Response而不是一个String(标记为@Produces("application/json"));,然后每次都设置状态代码;但我认为这是最糟糕的......

she*_*erb 6

您可以针对异常超类(即java.lang.Exception)编写单个 ExceptionMapper ,然后根据特定的异常类提供不同的行为,例如:

public class MyExceptionMapper implements ExceptionMapper<Exception> {
    @Override
    public Response toResponse(Exception exception) {
        if (exception instanceof EntityNotFoundException) {
            ...
        }
        else (exception instanceof NumberFormatException) {
            ...
        }
        else {
            // The catch-all handler...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但在我看来,这不像为每种类型的异常编写单独的映射器那么干净。一方面,这个映射器将捕获所有异常,另一方面,随着时间的推移,这个类可能会增长到难以处理的维度。也许这是代码风格的问题。

  • 我仍然更喜欢一堆 instanceof 检查,而不是将这个逻辑分散到几个不必要的小类中并忽略大局,即对于什么样的异常返回什么样的响应代码 (2认同)