gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:44:40 24 4
gpt4 key购买 nike

在我的一个项目中,我已经将 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();
}
}

但它永远不会被调用。 Jersey 总是选择 org.glassfish.jersey.server.validation.internal.ValidationExceptionMapper。我还尝试为我的自定义映射器使用 @Priority 注释,但不幸的是 Jersey 没有考虑到它。

那么这是怎么回事呢?它在以前的 Jersey 版本中工作得很好,所以它似乎是一个回归错误。

我放弃了。有什么线索吗?

最佳答案

原来是 2015 年 1 月引入的 Jersey 中的一个回归错误。

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

我在 JERSEY-3153 下填写了错误报告 ,后来移动为 issue #3425 .

老实说,我再也不会使用 Weld + Jersey 了……我已经厌倦了这种组合。在过去的两年里,我已经遇到了大约 10 个错误。我真的很累。

无论如何,我希望它能帮助到一些人。

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

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

关于java - 如何覆盖 Jersey 2.23 中的内置异常映射器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38681986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com