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

G. *_*cki 8 java jersey embedded-jetty jersey-2.0 weld2

在我的一个项目中,我已经将Jersey从版本升级2.142.23.但是我遇到了一个问题需要花费很多时间.我的项目ExceptionMapper为a 定义了自己的ValidationException,但不幸的是,Jersey已经为这个异常提供了一个内置的异常映射器,我无法覆盖它.

我已正确注册(我检查过)我自己的映射器,如下所示:

@Provider
public class ValidationExceptionMapper implements 
         ExceptionMapper<ValidationException> {

    @Override
    public Response toResponse(ValidationException exception) {
        return Response.status(Status.BAD_REQUEST).build();
    }
}
Run Code Online (Sandbox Code Playgroud)

但它永远不会被召唤.泽西总是拿起来org.glassfish.jersey.server.validation.internal.ValidationExceptionMapper.我也试过@Priority为我的自定义映射器使用 注释,但不幸的是Jersey没有考虑它.

那么发生了什么?它在以前的Jersey版本中运行得非常好,所以它似乎是一个回归错误.

我放弃.有线索吗?

G. *_*cki 5

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

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

我已经在JERSEY-3153下填写了一个错误报告,后来在#3425问题上移动了.

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

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

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

register(new AbstractBinder() {
    @Override
    protected void configure() {
        bind(my.custom.ValidationExceptionMapper.class).to(ExceptionMapper.class)
               .in(Singleton.class);
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 2k19,Jersey 2.27 - 这个错误仍然存​​在......这个解决方法仍然有效,谢谢!顺便说一句,新的错误主页:https://github.com/eclipse-ee4j/jersey/issues/3425 (2认同)

Jus*_*ose 5

Jersey 内置的 ValidationExceptionMapper 是通过 ValidationFeature 注册的。也许,用您自己的版本替换 Jersey 的 ValidationFeature 就可以解决问题。可以按如下方式完成。

\n\n

首先,禁用自动发现的 ValidationFeature

\n\n
property(ServerProperties.BV_FEATURE_DISABLE, true);\n
Run Code Online (Sandbox Code Playgroud)\n\n

下一步是注册 Jersey 验证功能的克隆

\n\n
public static class ValidationFeatureClone implements Feature {\n\n    @Override\n    public boolean configure(FeatureContext context) {\n        context.register(new ValidationBinder());\n        context.register(NewValidationExceptionMapper.class);\n        context.register(ValidationErrorMessageBodyWriter.class);\n        return true;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在克隆中,您应该指定新的 ExceptionMapper。

\n\n

最后,注册您的新功能

\n\n
register(ValidationFeatureClone.class)\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新:

\n\n

从 Jersey 2.20 开始,ValidationExceptionMapper可以使用 HK2 绑定覆盖默认值,如下所示。

\n\n
register(new AbstractBinder() {\n    @Override\n    protected void configure() {\n\n       bind(NewValidationExceptionMapper.class).to(ExceptionMapper.class)\n           .in(Singleton.class).ranked(10\xe2\x80\x8c\xe2\x80\x8b);\n    }\n});\n
Run Code Online (Sandbox Code Playgroud)\n