【发布时间】:2016-07-31 08:05:33
【问题描述】:
在我的一个项目中,我已经将 Jersey 从版本 2.14 升级到了 2.23。但我在一个问题上苦苦挣扎了好几个小时。我的项目为ValidationException 定义了自己的ExceptionMapper,但不幸的是,Jersey 已经为这个异常提供了一个内置的异常映射器,我无法覆盖它。
我已经正确注册(我检查过)我自己的映射器,如下所示:
@Provider
public class ValidationExceptionMapper implements
ExceptionMapper<ValidationException> {
@Override
public Response toResponse(ValidationException exception) {
return Response.status(Status.BAD_REQUEST).build();
}
}
但它永远不会被调用。泽西岛总是拿起org.glassfish.jersey.server.validation.internal.ValidationExceptionMapper。
我也尝试为我的自定义映射器使用 @Priority 注释,但不幸的是 Jersey 没有考虑到它。
那么发生了什么?它在以前的 Jersey 版本中运行良好,所以它似乎是一个回归错误。
我放弃了。有什么线索吗?
【问题讨论】:
-
您可以使用
ConstraintViolationException(这是验证异常的实际类型)作为解决方法。它比ValidationException更具体,因此优先。我从来没有想出如何禁用那个映射器,而不禁用 all 元信息提供程序(不是一个有趣的解决方案)。我的解决方法是简单地将映射器用于ConstraintViolationException -
谢谢,我知道,但这根本不能解决问题。因为应用程序必须响应
ValidationExceptions。 -
ConstraintViolationException扩展ValidationException。 Jersey 中的 bean 验证抛出的异常类型将始终是ConstraintViolationException。它适用于ValidationException,因为超类型映射器可以处理子类型异常,是否没有子类型的映射器 -
如果你在java.net/jira/browse/JERSEY 提交了一个关于这个回归的错误,那就太棒了。如果您添加一个简单的可重现案例,那就更好了。谢谢!
-
@peeskillet 原来是一个回归错误。可惜你没有早点报告。也许它会修复到现在。无论如何问候。
标签: java jersey jersey-2.0 embedded-jetty weld2