在Spring Boot应用程序中对@Value注释字段强制实施约束

Jel*_*tor 9 java spring spring-boot

我有以下字段注释@Value,指定一个默认值:

@Value("${tolerance.percentage:25}")
private int tolerance;
Run Code Online (Sandbox Code Playgroud)

如果该支柱存在,该代码会正确地将字段的值初始化为系统属性"tolerance.percentage".如果它不存在,则默认为25.

我想更进一步,通过在这个int字段强制执行min和max,因为它代表一个小于100的百分比作为一个整数,而Murphy定律意味着有人(可能是我)可以从外部错误配置属性和我的应用程序会在运行时开始做奇怪的事情,这对我来说太迟了.如果在应用程序启动时将属性设置为"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;
Run Code Online (Sandbox Code Playgroud)

我可以在知道的int字段上强制执行最小值和最大值@Value吗?

M. *_*num 9

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

  1. 您在类路径上有一个实现('hibernate-validator')
  2. 它们所在的类用于绑定外部化配置

所以不要使用@Value那些你可能想要创建一个包含预期属性并使用绑定的类@ConfigurationProperties.(你可能想要使用@Range).

@ConfigurationProperties(prefix="tolerance")
public ToleranceProperties {

    @Range(min=1, max=100)
    private int percentage = 25; 

    // Here be a getter/setter
}
Run Code Online (Sandbox Code Playgroud)

这组合在一个@Configuration类添加@ EnableConfigurationProperties(ToleranceProperties.class),您可以在任何需要属性的地方使用它.(请参阅参考指南中的typesafe配置属性.

注意:您也可以将其声明为@Component.

  • 你可以,但这不是“@ConfigurationProperties”的一般用例。 (2认同)