如何在Jersey 2.23中覆盖内置的异常映射器?

在我的一个项目中,我已经将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版本中运行得非常好,所以它似乎是一个回归错误.

我放弃.有什么线索吗?

它确实是2015年1月推出的Jersey中的回归错误.

Bug与两个Jersey的扩展相关:对于Weld和bean验证.
因为没有Weld容器启动,我的自定义ValidationExceptionMapper映射器优先于jersey-bean-validation模块提供的内置映射器,所以我的目标就实现了.

我在JERSEY-3153下填写了一份错误报告.

说实话,我再也不会再使用Weld Jersey ……我对这种组合太累了.在过去的两年里,我已经遇到了大约10个漏洞.我真的累了.

无论如何,我希望它会对某人有所帮助.

更新:
正如@Justin Jose在下面的评论中所注意到的,还有另一个针对上述错误的解决方法.我们可以使用HK2绑定来覆盖有问题的内置映射器:

register(new AbstractBinder() {
    @Override
    protected void configure() {
        bind(my.custom.ValidationExceptionMapper.class).to(ExceptionMapper.class)
               .in(Singleton.class);
    }
});
相关文章
相关标签/搜索