【问题标题】:Enforce constraints on @Value annotated field in Spring Boot application在 Spring Boot 应用程序中对 @Value 注释字段实施约束
【发布时间】:2017-10-15 21:23:37
【问题描述】:

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

@Value("${tolerance.percentage:25}")
private int tolerance;

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

不过,我想更进一步,通过在这个 int 字段上强制执行最小值和最大值,因为它代表的百分比小于 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 字段强制执行最小值和最大值吗?

【问题讨论】:

  • @Value 在启动时注入值(对于单例,不确定您是否拥有 prototype 的 bean);我认为您当时不会(自动)触发 bean 验证...
  • 您只会在@ConfigurationProperties 类中获得验证,而不是在常规类中。如果要验证这些值,请添加 @PostConstruct 方法来检查范围。或者将其注入构造函数并在那里进行验证。
  • @M.Deinum 将@ConfigurationProperties 添加到我的pojo 工作。添加后,注释开始像我想的那样协同工作。如果您将您的评论正式化为答案,我会接受。

标签: java spring spring-boot


【解决方案1】:

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

  1. 您在类路径上有一个实现(“hibernate-validator”)
  2. 他们所在的类用于绑定externalized configuration

因此,您可能希望创建一个包含预期属性的类并使用与@ConfigurationProperties 的绑定,而不是使用@Value。 (您可能想改用@Range)。

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

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

    // Here be a getter/setter
}

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

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

【讨论】:

  • 我只是补充一点,setter 是必须的,而 getter 不是
  • 在没有getter 的情况下拥有这个没有真正意义,因为您将如何获得价值? (除非它是另一个组合属性的一部分)。
  • 你可以用@ConfigurationProperties注释@Component,然后这个组件会在内部使用这些属性。
  • 你可以,但这不是@ConfigurationProperties的一般用例。
猜你喜欢
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 2022-11-03
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
相关资源
最近更新 更多