由ExceptionMapper捕获的jaxrs中的自定义WebApplicationExceptions显示在服务器日志中

时间:2018-03-23 16:02:47

标签: java java-ee exception-handling jax-rs exceptionmapper

我使用以下Exceptionmapper将我的jaxrs rest api中的WebApplicationExceptions映射到响应。

@Provider
public class ErrorHandler implements ExceptionMapper<WebApplicationException> {
    @Override
    public Response toResponse(WebApplicationException e) {
        int status = e.getResponse().getStatus();

        JsonObject errorResponse = Json.createObjectBuilder()
                .add("status", status)
                .add("message", e.getMessage())
                .build();

        return Response.status(status)
                .entity(errorResponse)
                .type(MediaType.APPLICATION_JSON)
                .build();
    }
}

这样可以正常运行,但是当我抛出自定义错误时,例如throw new NotFoundException("custom message");,堆栈跟踪会显示在我的服务器日志中。有谁能解释一下?或者有人知道解决方案吗?

TL; DR;

出于某种原因,当我从我的jax-rs代码中抛出WebApplicationExceptions时,我的ExceptionMapper处理错误但仍然抛出它,因此它显示在服务器日志中。

任何解决方案?

1 个答案:

答案 0 :(得分:1)

我找到了这个问题的根源并设法解决了它。

来自JAX-RS spec

  

当选择异常映射提供程序来映射异常时,实现必须使用其泛型类型是异常的最近超类的提供程序。

ExceptionMapper我使用了WebApplicationException,因此会映射每个错误。问题是WebApplicationException不是(例如)NotFoundException最近的超类。中间有一个ClientErrorException个超类。当我将我的mapper更改为该类时,问题就解决了。

因为我只想将客户端错误映射到Json响应,所以这个解决方案对我来说很好。