如何解决验证代理Java Bean不能与正确值进行比较
我目前正在尝试进行CDI扩展,以验证绑定到配置值的Java对象。
public class ClassConfig {
@Range(min = 1000,max = 9999)
private int value;
@Inject
public ClassConfig(@ConfigProperty(name = "value") int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
当我使用@Singleton
注释制作上述类时,它可以完美地工作。启动时,CDI扩展成功验证了读取称为“值”的环境变量的类。
Class: com.example.ClassConfig
Property: value
Value: 22222
Reason: must be between 1000 and 9999
当我将@Singleton
替换为@ApplicationScoped
时,当我自己注入和使用此类时,它可以按预期工作,但是在CDI扩展名中,javax.validation.Validator
似乎总是对待{{ 1}}设为0。
value
我正在努力弄清楚为什么会这样,有人能提供有关如何确保正确读取值的指导吗?我一直试图实现的两件事无济于事:
- 具有扩展名的程序会在启动时为各个类强制进行初始化。
- 让CDI扩展等待Bean初始化。
以下是我如何致电Class: com.example.ClassConfig$Proxy$_$$_WeldClientProxy
Property: value
Value: 0
Reason: must be between 1000 and 9999
:
#validate
解决方法
几件事:
- 首先,如果您想做的就是使Bean验证正常工作,只需将Hibernate Validator CDI project放在运行时类路径中即可。没什么其他的了;结束。
- 如果要执行其他操作,则可能会遇到这样的事实,即在正常范围内对bean的上下文引用是client proxy。用较不闷的术语来说,这意味着它是“代理”,shell,持有人,并且其“内脏”(其指称,是它所代理的事物)在代理上调用某种方法之前不会“膨胀”,例如{{1 }}或一种业务方法。我猜测您的情况是验证者直接在代理上寻找可验证的字段。
- “引用”上下文引用的一种方法是在执行其他操作之前立即对其调用
toString()
。因此,在执行其他操作以“添加”引用之前,只需致电toString()
。 - 我认为无法保证代理将以某种方式神奇地将代理对象的字段提供给您。为此,您需要获取内部代理对象。每个CDI实施的操作都略有不同,但是在Weld you can get this programmatically with some casting中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。