我使用以下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处理错误但仍然抛出它,因此它显示在服务器日志中。
任何解决方案?
答案 0 :(得分:1)
我找到了这个问题的根源并设法解决了它。
当选择异常映射提供程序来映射异常时,实现必须使用其泛型类型是异常的最近超类的提供程序。
在ExceptionMapper
我使用了WebApplicationException
,因此会映射每个错误。问题是WebApplicationException
不是(例如)NotFoundException
最近的超类。中间有一个ClientErrorException
个超类。当我将我的mapper更改为该类时,问题就解决了。
因为我只想将客户端错误映射到Json响应,所以这个解决方案对我来说很好。