[英]JAX-RS (jersey implementation) ExceptionMapper<Throwable> aren't catching ConstraintViolationException
我有一个ExceptionMapper
作为处理我所有ExceptionMapper
的Provider
。
所以很明显,我的类实现了ExceptionMapper<Throwable>
并且我们知道,所有异常都以某种方式扩展了Throwable
。
现在我使用 jax-rs @NotNull
来检查我的资源输入值是否为空,并且通过一些搜索,我意识到当注释字段为空时它会抛出ConstraintViolationException
。
所以我尝试处理它并在我的 ExceptionMapper 中添加一些细节来响应(添加一些自定义 json 模型),如下所示:
@Provider
public class AllExceptionMapper implements ExceptionMapper<Throwable> {
private final Logger logger = LogManager.getLogger(AllExceptionMapper.class);
@Override
public Response toResponse(Throwable ex) {
Response response;
CustomError error;
// handle some errors
else if (ex instanceof ConstraintViolationException) {
error = new CustomError(
324, // predefined error type in our documents
"some details"
);
response = Response.status(Response.Status.BAD_REQUEST).entity(error).build();
}
// handle some other errors
return response;
}
}
问题是这不起作用,但是如果我创建另一个实现ExceptionMapper<ConstraintViolationException>
异常映射器提供程序并在那里处理它,它可以正常工作。
正如我之前所说(并检查过)所有异常都是从Throwable
类扩展而来的,所以我错过了什么,为什么它不起作用?
......
通过不起作用,我的意思是它忽略了我的映射器(从ExceptionMapper<Throwable>
实现的映射器)并具有正常行为,即返回状态代码 400 没有响应负载,就像根本没有映射器一样
ExceptionMapper
应该工作的方式是,您可以创建一个通用的ExceptionMapper<Throwable>
来处理所有错误。 然后您可以创建更具体的ExceptionMapper
,以另一种方式处理更具体的错误。 所有这些都在单独的课程中。
在单独的类中执行它的事实对您有用,让我相信某处有一个更具体的ExceptionMapper
,它可以在您之前处理异常。
ExceptionMappers 的使用方式实际上非常干净,并且还可以保持您的代码干净。 想要将代码保存在一个中心位置, if
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.