ExceptionMapper 捕获的 jax rs 中的自定义 WebApplicationException 显示在服务器日志中

Custom WebApplicationExceptions in jaxrs caught by ExceptionMapper show up in server log

我使用以下 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 处理了错误但仍然抛出它,因此它显示在服务器日志中。

有什么解决办法吗?

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

来自JAX-RS spec

When choosing an exception mapping provider to map an exception, an implementation MUST use the provider whose generic type is the nearest superclass of the exception.

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

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