小编典典

不变的@ConfigurationProperties

spring-boot

带有Spring Boot @ConfigurationProperties注释的不可变(最终)字段是否可能?下面的例子

@ConfigurationProperties(prefix = "example")
public final class MyProps {

  private final String neededProperty;

  public MyProps(String neededProperty) {
    this.neededProperty = neededProperty;
  }

  public String getNeededProperty() { .. }
}

到目前为止我尝试过的方法:

  1. 创建@Bean了的MyProps两个类的构造函数
    • 提供两个构造函数:空和带neededProperty参数
    • 该bean是用创建的 new MyProps()
    • 结果在现场 null
  2. 使用@ComponentScan@Component提供MyPropsbean。
    • 结果BeanInstantiationException->NoSuchMethodException: MyProps.<init>()

我让它起作用的唯一方法是为每个非最终字段提供getter / setter。


阅读 303

收藏
2020-05-30

共1个答案

小编典典

从Spring Boot 2.2开始,最后可以定义一个用修饰的不可变类@ConfigurationProperties
该文档显示了一个示例。
您只需要声明一个带有绑定字段的构造函数(而不是setter方法),并@ConstructorBinding在类级别添加注释以指示应使用构造函数绑定。
因此,您的实际代码没有任何二传手就可以了:

@ConstructorBinding
@ConfigurationProperties(prefix = "example")
public final class MyProps {

  private final String neededProperty;

  public MyProps(String neededProperty) {
    this.neededProperty = neededProperty;
  }

  public String getNeededProperty() { .. }
}
2020-05-30