我正在使用Jersey / JAX-RS来实现RESTful Web服务.我对ExceptionMapper
interface有疑问,似乎没有任何地方记录在案.
假设我有以下自定义(扩展RuntimeException)异常:
> FizzException扩展RuntimeException
> BuzzException扩展了FizzException
现在,让我们说我的异常映射器执行以下“异常到响应”映射:
> FizzException实际上映射到未找到的HTTP 404
> BuzzException映射到未经授权的HTTP 403
>其他所有内容都映射到HTTP 500内部服务器错误
因此,如果我正确理解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?
>另一种方法:当抛出异常时,由于BuzzException最终是一个异常,因此将触发该映射器:BuzzExceptionMapper,FizzExceptionMapper或DefaultExceptionMapper?
解决方法:
最具体的异常映射器将被调用.
因此,在您的情况下:
> BuzzException将由BuzzExceptionMapper映射
> FizzException将由FizzExceptionMapper映射
> others异常将由DefaultExceptionMapper映射