我使用Jersey / JAX-RS来实现RESTful Web服务。我有一个关于ExceptionMapper
interface的问题,这似乎没有在任何地方记录。
说我有以下自定义(扩展RuntimeException
)例外:
FizzException extends RuntimeException
BuzzException extends FizzException
现在让我们说我希望我的异常映射器执行以下Exception
- 到 - Response
映射:
FizzException
实际上映射到HTTP 404 NOT FOUND BuzzException
映射到HTTP 403 UNAUTHORIZED 因此,如果我正确理解API,我需要实现3个不同的异常映射器:
@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
,最终扩展Exception
。因此,如果抛出BuzzException
,将触发哪个映射器:BuzzExceptionMapper
,FizzExceptionMapper
或DefaultExceptionMapper
?Exception
时,由于BuzzException
最终是Exception
,所以映射器会触发:BuzzExceptionMapper
,{{1} }或FizzExceptionMapper
?答案 0 :(得分:4)
将调用最具体的异常映射器。
所以在你的情况下,BuzzException
将由BuzzExceptionMapper
映射,当抛出一般异常时,它将由DefaultExceptionMapper