验证代理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中。