Jersey / JAX-RS ExceptionMappers和继承

IAm*_*aja 3 java rest error-handling jax-rs jersey

我正在使用Jersey / JAX-RS来实现RESTful Web服务。我对ExceptionMapper接口有疑问,似乎在任何地方都没有记录。

假设我有以下自定义(extend RuntimeException)异常:

  • FizzException extends RuntimeException
  • BuzzException extends FizzException

现在,让我们说我的异常映射器执行以下ExceptionResponse映射的映射:

  • FizzException 实际上映射到未找到的HTTP 404
  • BuzzException 映射到HTTP 403 UNAUTHORIZED
  • 其他所有内容都映射到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
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这使我感到好奇:由于我们正在进行异常类继承,因此实际上将触发哪些映射器?例如:

  • BuzzException延伸FizzException,最终延伸Exception。所以,如果一个BuzzException被抛出,其中映射器会火:BuzzExceptionMapperFizzExceptionMapperDefaultExceptionMapper
  • 周围的其他方法:当Exception被抛出,因为BuzzException是最终的Exception,这映射火灾:BuzzExceptionMapperFizzExceptionMapperDefaultExceptionMapper

小智 5

最具体的异常映射器将被调用。

因此,在您的情况下:

  • BuzzException 将被映射 BuzzExceptionMapper
  • FizzException 将被映射 FizzExceptionMapper
  • 其他人Exception将被映射DefaultExceptionMapper