我使用以下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");,stacktrace将显示在服务器日志中。谁能解释一下?还是有人知道解决方案?

TL; DR;

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

有什么办法吗?

最佳答案

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

JAX-RS spec


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


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

由于我只想将客户端错误映射到Json响应,因此该解决方案对我来说效果很好。

关于java - 服务器日志中显示由ExceptionMapper捕获的jaxrs中的自定义WebApplicationExceptions,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49453868/

10-09 08:10