相同的ExceptionMapper用于不同的异常

时间:2014-10-15 15:19:19

标签: java rest jersey

我的应用程序提供RESTful接口来执行某些操作。我正在使用ExceptionMapper来捕获NoResultExceptionEntityNotFoundException等异常,然后返回状态代码404或NumberFormatExceptionConstraintViolationException等异常并返回状态代码为400 ......等。

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

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

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

1 个答案:

答案 0 :(得分:4)

您可以针对异常超类(即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...
        }
    }
}

但在我看来,这并不像为每种类型的异常编写单独的映射器一样干净。首先,这个映射器将捕获所有异常,而对于另一个异常,这个类可能会随着时间的推移而变得难以处理。也许这是代码风格的问题。