Jersey / JAX-RS ExceptionMappers和继承

时间:2014-12-11 12:21:58

标签: java rest error-handling jersey jax-rs

我使用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
  • 其他所有内容都映射到HTTP 500 INTERNAL SERVER ERROR

因此,如果我正确理解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,将触发哪个映射器:BuzzExceptionMapperFizzExceptionMapperDefaultExceptionMapper
  • 反过来说:当抛出Exception时,由于BuzzException最终是Exception,所以映射器会触发:BuzzExceptionMapper,{{1} }或FizzExceptionMapper

1 个答案:

答案 0 :(得分:4)

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

所以在你的情况下,BuzzException将由BuzzExceptionMapper映射,当抛出一般异常时,它将由DefaultExceptionMapper

映射