0

我使用以下 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;博士;

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

有什么解决办法吗?

4

1 回答 1

1

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

来自JAX-RS 规范

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不是 (eg) 的最近超类NotFoundException。中间有一个ClientErrorException超类。当我将映射器更改为该类时,问题就解决了。

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

于 2018-03-23T16:31:18.820 回答