泽西岛的全球异常处理

时间:2012-06-08 20:20:49

标签: java rest jersey

有没有办法在泽西岛进行全局异常处理?而不是单个资源有try / catch块,然后调用一些方法然后清理所有要发送回客户端的异常,我希望有一种方法可以将它放在实际调用资源的地方。这甚至可能吗?如果是这样,怎么样?

而不是sanitize(e)会在Jersey servlet中抛出一些Jersey配置的异常:

@GET
public Object getStuff() {
    try {
        doStuff();
    } catch (Exception e) {
        ExceptionHandler.sanitize(e);
    }
}

有:

@GET
public Object getStuff() throws Exception {
    doStuff();
}

将异常发送到我可以截取的内容并从那里调用sanitize(e)

这实际上只是为了简化泽西岛的所有资源,并保证返回客户端的异常总是以某种可理解的形式出现。

3 个答案:

答案 0 :(得分:42)

是。 JAX-RS具有ExceptionMappers的概念。您可以创建自己的ExceptionMapper接口,以将任何异常映射到响应。有关详细信息,请参阅:https://jersey.github.io/documentation/latest/representations.html#d0e6352

答案 1 :(得分:5)

javax.ws.rs.ext.ExceptionMapper是你的朋友。

来源:https://jersey.java.net/documentation/latest/representations.html#d0e6665

示例:

@Provider
public class EntityNotFoundMapper implements ExceptionMapper<javax.persistence.EntityNotFoundException> {
  public Response toResponse(javax.persistence.EntityNotFoundException ex) {
    return Response.status(404).
      entity(ex.getMessage()).
      type("text/plain").
      build();
  }
}

答案 2 :(得分:0)

以上所有答案仍然有效。但是对于最新版本的spring Boot,请考虑以下方法之一。

方法1: @ ExceptionHandler-使用此注释对控制器中的方法进行注释。

这种方法的缺点是我们需要在每个控制器中编写一个带有此批注的方法。

我们可以通过使用基本控制器扩展所有控制器来解决该解决方案(该基本控制器可以具有一个用@ExceptionHandler注释的方法。但是可能并非总是如此。

方法2:

  • 使用@ControllerAdvice注释类并使用@ExceptionHandler定义方法

  • 这类似于基于Controller的异常(请参阅方法1),但是在controller类未处理异常时使用。 这种方法对于在Rest Api中全局处理异常非常有用