Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jersey/JAX-RS异常外观和继承_Java_Rest_Error Handling_Jersey_Jax Rs - Fatal编程技术网

Java Jersey/JAX-RS异常外观和继承

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 其他一切都

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

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

  • FizzException扩展了RuntimeException
  • BuzzException扩展了FizzException
现在让我们假设我希望我的异常映射程序执行以下
异常
-to-
响应
映射:

  • FizzException
    实际上映射到未找到的HTTP 404
  • 蜂鸣器异常
    映射到未经授权的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
    }
}
@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

    牛是一种动物。所以,如果你把一头牛叫做“动物”,然后把它从山上扔下来,你从山上扔下来的是什么?最后还是一头牛。类似地,如果你抛出一个蜂鸣器异常,那么这就是你从山上抛出的东西——即使你称之为“嘶嘶异常”。谢谢@Gimby,我有点理解你的类比,但仍然可以看到一个
    蜂鸣器异常映射
    蜂鸣器异常
    视为
    异常的情况,因此,映射抛出了
    Exception
    s,这是我问题的基础。但是Jersey似乎足够聪明,可以执行必要的类检查,所以不用担心:-)“因此,如果我正确理解API,我需要实现3个不同的异常映射器”-您不必:-)在
    FizzExceptionMapper
    中,您可以检查
    如果(e.getClass()==BuzzException.class)
    。同样仅供参考,让您的异常类扩展
    WebApplicationException
    并在构造函数中映射响应也是非常常见的,如图所示。默认的Jersey映射器将处理它。我们不需要创造我们自己的。除非这个异常类已经存在,否则您将需要映射程序。