我正在使用 Jersey/JAX-RS 来实现 RESTful Web 服务。我有一个关于 ExceptionMapper interface 的问题,它似乎没有记录在任何地方。

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

  • FizzException extends RuntimeException
  • BuzzException extends FizzException

  • 现在假设我希望我的异常映射器执行以下 Exception -to- Response 映射:
  • FizzException 实际上映射到 HTTP 404 NOT FOUND
  • 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
        }
    }
    

    然而,这让我很好奇:既然我们正在进行异常类继承,那么哪些映射器实际上会触发?例如:
  • BuzzException 扩展 FizzException ,最终扩展 Exception 。因此,如果抛出 BuzzException ,将触发哪个映射器: BuzzExceptionMapperFizzExceptionMapperDefaultExceptionMapper
  • 反过来:当抛出 Exception 时,因为 BuzzException 最终是 Exception ,映射器会触发: BuzzExceptionMapperFizzExceptionMapper 还是 DefaultExceptionMapper
  • 最佳答案

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

    所以在你的情况下:

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

    关于java - Jersey/JAX-RS ExceptionMappers 和继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27422793/

    10-14 11:39