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注释的验证仅在某些情况下有效
@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
}