java-Jersey / JAX-RS ExceptionMappers和继承

我正在使用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映射

上一篇:java-使用Jersey的动态实例级授权(基于id)


下一篇:java-无法使用Jersey解析RESTful应用程序中的日期