Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring启动应用程序中对@Value注释字段强制执行约束_Java_Spring_Spring Boot - Fatal编程技术网

Java 在Spring启动应用程序中对@Value注释字段强制执行约束

Java 在Spring启动应用程序中对@Value注释字段强制执行约束,java,spring,spring-boot,Java,Spring,Spring Boot,我用@Value注释了以下字段,指定了默认值: @Value("${tolerance.percentage:25}") private int tolerance; 该代码正确地将字段值初始化为系统属性“tolerance.percentage”(如果该属性存在)。如果不存在,则默认为25 不过,我想更进一步,在这个int字段上强制使用min和max,因为它代表的百分比小于100,而墨菲定律意味着有人(可能是我)可能会在外部错误地配置属性,我的应用程序会在运行时开始做奇怪的事情,这对我来说太

我用
@Value
注释了以下字段,指定了默认值:

@Value("${tolerance.percentage:25}")
private int tolerance;
该代码正确地将字段值初始化为系统属性“tolerance.percentage”(如果该属性存在)。如果不存在,则默认为25

不过,我想更进一步,在这个int字段上强制使用min和max,因为它代表的百分比小于100,而墨菲定律意味着有人(可能是我)可能会在外部错误地配置属性,我的应用程序会在运行时开始做奇怪的事情,这对我来说太晚了。如果在应用程序启动时将属性设置为“101”或“-1”,我希望抛出一个错误。见鬼,如果我在
@Value
注释中尝试将其默认为101,我甚至希望抛出一个错误,但这对于这个问题来说并不重要。以下是我尝试过的:

//@Min and @Max don't produce the intended behavior when combined with @Value
@Min(0)
@Max(100)
@Value("${tolerance.percentage:25}")
private int tolerance;

我是否可以对
@Value
知道的
int
字段强制执行最小值和最大值?

使用常规验证API注释的验证仅在某些情况下有效

  • 在类路径上有一个实现(“hibernate-validator”)
  • 它们所在的类用于绑定
  • 因此,您可能希望创建一个包含预期属性的类,并使用与
    @ConfigurationProperties
    的绑定,而不是将
    @Value
    用于这些属性。(您可能想改用
    @Range

    这与
    @Configuration
    类相结合,添加
    @EnableConfigurationProperties(ToleranceProperties.class)
    ,您可以在任何需要属性的地方使用它。(请参见参考指南中的


    注意:您还可以将其声明为
    @组件

    @Value
    在启动时注入该值(对于单例,不确定您是否将该bean作为
    原型
    );我认为不会触发bean验证(自动)那时…您将只在
    @ConfigurationProperties
    类中得到验证,而不是在常规类中得到验证。如果要验证这些值,请添加
    @PostConstruct
    方法来检查范围。或者将其注入构造函数并在其中进行验证。@M.Deinum将
    @ConfigurationProperties
    添加到我的pojo w中工作。添加它之后,注释开始像我所想的那样一起工作。如果你将你的注释形式化为一个答案,我将接受它。我只想补充一点,setter是这项工作必须的,而getter如果没有一个
    getter
    就没有任何意义,因为如何获得值?(除非它是另一个组合属性的一部分)。您可以使用
    @ConfigurationProperties
    注释
    @Component
    ,然后此组件将在内部使用这些属性。您可以,但这不是
    @ConfigurationProperties
    的一般用例。
    @ConfigurationProperties(prefix="tolerance")
    public ToleranceProperties {
    
        @Range(min=1, max=100)
        private int percentage = 25; 
    
        // Here be a getter/setter
    }