我使用以下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/