G. *_*cki 8 java jersey embedded-jetty jersey-2.0 weld2
在我的一个项目中,我已经将Jersey从版本升级2.14到2.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版本中运行得非常好,所以它似乎是一个回归错误.
我放弃.有线索吗?
它确实是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)
Jersey 内置的 ValidationExceptionMapper 是通过 ValidationFeature 注册的。也许,用您自己的版本替换 Jersey 的 ValidationFeature 就可以解决问题。可以按如下方式完成。
\n\n首先,禁用自动发现的 ValidationFeature
\n\nproperty(ServerProperties.BV_FEATURE_DISABLE, true);\nRun Code Online (Sandbox Code Playgroud)\n\n下一步是注册 Jersey 验证功能的克隆
\n\npublic 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}\nRun Code Online (Sandbox Code Playgroud)\n\n在克隆中,您应该指定新的 ExceptionMapper。
\n\n最后,注册您的新功能
\n\nregister(ValidationFeatureClone.class)\nRun Code Online (Sandbox Code Playgroud)\n\n更新:
\n\n从 Jersey 2.20 开始,ValidationExceptionMapper可以使用 HK2 绑定覆盖默认值,如下所示。
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});\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2816 次 |
| 最近记录: |