Java 不同异常的相同异常标记

Java 不同异常的相同异常标记,java,rest,jersey,Java,Rest,Jersey,我的应用程序提供了一个RESTful接口来执行一些操作。我正在使用ExceptionMapper捕获异常,如NoResultException或EntityNotFoundException,然后返回状态代码404,或异常,如NumberFormatException或ConstraintViolationException并返回状态代码400。。。等等 我的问题是,exceptionapper每次只允许我选择一种异常;所以我不能对所有的错误400使用同一个类,而对其他形式的错误404使用同一个

我的应用程序提供了一个RESTful接口来执行一些操作。我正在使用
ExceptionMapper
捕获异常,如
NoResultException
EntityNotFoundException
,然后返回状态代码404,或异常,如
NumberFormatException
ConstraintViolationException
并返回状态代码400。。。等等

我的问题是,
exceptionapper
每次只允许我选择一种异常;所以我不能对所有的错误400使用同一个类,而对其他形式的错误404使用同一个类

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


我的另一个选项是更改我的函数以返回响应而不是字符串(标记为
@products(“application/json”)然后每次设置状态代码;但我认为这是最糟糕的…

您可以针对异常超类(即
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...
        }
    }
}
公共类MyExceptionMapper实现ExceptionMapper{
@凌驾
公众响应(例外){
if(EntityNotFoundException的异常实例){
...
}
else(NumberFormatException的异常实例){
...
}
否则{
//捕获所有处理程序。。。
}
}
}

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

我也这么想;但正如你所说,这是不干净的。事实上您可以为不同的类编写几个ExceptionMapper,并为它们的超类编写一个ExceptionMapper(如Exception);带有特定ExceptionMapper的异常将使用它;所有其他的都将使用它的超类的ExceptionMapper。我仍然更喜欢一堆instanceof checks,而不是在几个不必要的小类中分割这个逻辑,而忽略了全局,也就是说,对于什么类型的异常,会返回什么样的响应代码