【问题标题】:Global custom exception handler in resteasyresteasy 中的全局自定义异常处理程序
【发布时间】:2015-10-07 22:26:00
【问题描述】:

是否可以为所有意外错误创建全局异常处理程序。 因为不可能使所有可能的类都像这样:

public class ExceptionHandler implements ExceptionMapper<JsonMappingException> {...}

我想要这样的东西:

public class ExceptionHandler implements ExceptionMapper<Exception> 

【问题讨论】:

标签: resteasy


【解决方案1】:

请注意,尽管接受的答案确实捕获了所有异常,但它会导致许多其他问题,例如干扰 Resteasy 的 internal exception handling

因此,如果您采用这种方法,您还应该为每个对您很重要的方法构建自定义异常映射。

特别是此方法会破坏内置的CORS 处理,因此如果您允许 CORS 响应,您应该创建一个 CORS 自定义异常映射器。

@Provider
public class DefaultOptionsExceptionHandler implements ExceptionMapper<DefaultOptionsMethodException> {

    @Override
    public Response toResponse(DefaultOptionsMethodException e) {
        return e.getResponse(); 
    }
}

【讨论】:

  • 嗨@Pool 我正在经历你所描述的;除了为每个 JAX-RS“系统”异常定义映射器之外,还有什么更好的方法来创建全局异常映射器?
【解决方案2】:

您可能会执行以下操作:

@Provider
public class GlobalExceptionHandler implements ExceptionMapper<Exception> {
    public Response toResponse(Exception exception) {
        return Response.status(Status.INTERNAL_SERVER_ERROR)
            .entity("An error occured").type(MediaType.TEXT_PLAIN)
            .build();
    }
}

我刚刚在 RESTEasy 3.0.6.Final 中对其进行了测试,它似乎可以工作。请记住,500 Internal Server Error 状态代码可能并不总是合适的。

【讨论】:

  • 此异常处理程序覆盖所有默认的 RESTEasy 异常处理程序(如 NotFoundException 处理程序等等)。这不是很方便。
  • 一个方便的解决方案可能是使用if (exception instanceof NullPointerException) 并针对不同的异常使用多个else if (...)
【解决方案3】:

似乎没有简单的方法可以做到。我必须修改返回正确的 ExceptionMapper 的 ResteasyProviderFactory。但是我应该更改几个类,因为直接使用内置类 ResteasyProviderFactory

【讨论】:

    猜你喜欢
    • 2022-10-19
    • 2011-04-07
    • 2014-04-17
    • 2012-12-31
    • 2011-05-19
    • 2011-08-31
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多