Java Jersey/JAX-RS异常外观和继承
我正在使用Jersey/JAX-RS实现一个restfulweb服务。我有一个关于的问题,似乎在任何地方都没有记录 假设我有以下自定义(扩展Java Jersey/JAX-RS异常外观和继承,java,rest,error-handling,jersey,jax-rs,Java,Rest,Error Handling,Jersey,Jax Rs,我正在使用Jersey/JAX-RS实现一个restfulweb服务。我有一个关于的问题,似乎在任何地方都没有记录 假设我有以下自定义(扩展RuntimeException)异常: FizzException扩展了RuntimeException BuzzException扩展了FizzException 现在让我们假设我希望我的异常映射程序执行以下异常-to-响应映射: FizzException实际上映射到未找到的HTTP 404 蜂鸣器异常映射到未经授权的HTTP 403 其他一切都
RuntimeException
)异常:
FizzException扩展了RuntimeException
BuzzException扩展了FizzException
异常
-to-响应
映射:
实际上映射到未找到的HTTP 404FizzException
映射到未经授权的HTTP 403蜂鸣器异常
- 其他一切都映射到HTTP 500内部服务器错误
@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
}
}
@Provider
公共类DefaultExceptionMapper实现ExceptionMapper{
@凌驾
对响应的响应(异常exc){
//映射到HTTP 500
}
}
@提供者
公共类FizzExceptionMapper实现ExceptionMapper{
@凌驾
对响应的响应(异常exc){
//映射到HTTP404
}
}
@提供者
公共类BuzzExceptionMapper实现ExceptionMapper{
@凌驾
对响应的响应(异常exc){
//映射到HTTP 403
}
}
然而,这让我感到好奇:既然我们有异常类继承,那么究竟会触发哪些映射程序呢?例如:
扩展了BuzzException
,它最终扩展了FizzException
。因此,如果抛出了一个Exception
,将触发哪个映射程序:BuzzException
,BuzzExceptionMapper
或FizzExceptionMapper
DefaultExceptionMapper
- 另一种方法是:当抛出
时,因为异常
最终是一个蜂鸣器异常
,映射器触发:异常
,蜂鸣器异常映射器
或蜂鸣器异常映射器
默认异常映射器
将由BuzzException
BuzzExceptionMapper
将由FizzException
FizzExceptionMapper
- 其他
将由Exception
defaultexceptionapper
将调用大多数特定的异常映射程序 因此,在你的情况下:
蜂鸣器异常映射
将蜂鸣器异常
视为异常的情况,因此,映射抛出了Exception
s,这是我问题的基础。但是Jersey似乎足够聪明,可以执行必要的类检查,所以不用担心:-)“因此,如果我正确理解API,我需要实现3个不同的异常映射器”-您不必:-)在FizzExceptionMapper
中,您可以检查如果(e.getClass()==BuzzException.class)
。同样仅供参考,让您的异常类扩展WebApplicationException
并在构造函数中映射响应也是非常常见的,如图所示。默认的Jersey映射器将处理它。我们不需要创造我们自己的。除非这个异常类已经存在,否则您将需要映射程序。