我正在使用Jersey/JAX-RS来实现一个RESTful Web服务。我有一个关于
假设我有以下自定义(扩展
然而,这让我很好奇:由于我们有异常类继承,哪些映射器实际上会触发?例如:
- BuzzException 扩展 FizzException,FizzException 最终扩展 Exception。那么,如果抛出 BuzzException,哪个映射器将触发:BuzzExceptionMapper、FizzExceptionMapper 还是 DefaultExceptionMapper? - 反过来:当抛出一个 Exception 时,由于 BuzzException 最终也是 Exception,哪个映射器将触发:BuzzExceptionMapper、FizzExceptionMapper 还是 DefaultExceptionMapper?
ExceptionMapper
接口的问题,但它似乎没有被记录在任何地方。假设我有以下自定义(扩展
RuntimeException
)异常:
FizzException extends RuntimeException
BuzzException extends FizzException
Exception
-to- Response
映射:
FizzException
实际上映射到 HTTP 404 NOT FOUNDBuzzException
映射到 HTTP 403 UNAUTHORIZED- 其他情况都映射到 HTTP 500 INTERNAL SERVER ERROR
@Provider
public class DefaultExceptionMapper implements ExceptionMapper<Exception> {
@Override
Response toResponse(Exception exc) {
// Map to HTTP 500
}
}
@Provider
public class FizzExceptionMapper implements ExceptionMapper<FizzException> {
@Override
Response toResponse(Exception exc) {
// Map to HTTP 404
}
}
@Provider
public class BuzzExceptionMapper implements ExceptionMapper<BuzzException> {
@Override
Response toResponse(Exception exc) {
// Map to HTTP 403
}
}
然而,这让我很好奇:由于我们有异常类继承,哪些映射器实际上会触发?例如:
- BuzzException 扩展 FizzException,FizzException 最终扩展 Exception。那么,如果抛出 BuzzException,哪个映射器将触发:BuzzExceptionMapper、FizzExceptionMapper 还是 DefaultExceptionMapper? - 反过来:当抛出一个 Exception 时,由于 BuzzException 最终也是 Exception,哪个映射器将触发:BuzzExceptionMapper、FizzExceptionMapper 还是 DefaultExceptionMapper?
BuzzExceptionMapp
认为BuzzException
是一个Exception
,因此映射抛出的Exception
,这是我的问题基础。但似乎Jersey已经足够聪明地进行必要的类检查,所以不用担心 :-) - IAmYourFajaFizzExceptionMapper
中,你可以检查if (e.getClass() == BuzzException.class)
。另外,只是一个FYI,将您的异常类扩展为WebApplicationException
并在构造函数中映射响应也是非常常见的,如此处所示。默认的Jersey映射器会处理它。 我们不需要创建自己的映射器。除非这个异常类已经存在,那么你就需要用到映射器。 - Paul Samsotha