从目前情况来看,所需的行为可以通过基于 setter 的绑定来实现:
@ConfigurationProperties("sample")
public class SampleMutableProperties {
/**
* Location to use. Defaults to a directory named example in the user's home directory.
*/
private String location = System.getProperty("user.home") + "/example";
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
}
使用如下不可变配置属性也可以实现同样的效果:
@ConstructorBinding
@ConfigurationProperties("sample")
public class SampleImmutableProperties {
/**
* Location to use. Defaults to a directory named example in the user's home directory.
*/
private final String location;
public SampleImmutableProperties(String location) {
this.location = (location != null) ? location : System.getProperty("user.home") + "/example";
}
public String getLocation() {
return location;
}
}
的 javadoc 声明@DefaultValue
它“可用于在绑定到不可变属性时指定默认值”。当您尝试将其转换SampleMutableProperties
为不可变时,这并不准确。您必须在构造函数中手动执行默认值,如上所示。
知道您只有一个字符串可以使用,尝试使用@DefaultValue("${user.home}/example")
(特别是如果您已经熟悉 Spring)对我来说似乎很合乎逻辑,但它不会像希望的那样工作,因为${user.home}
会保持原样。如果它像 @odrotbohm 预期的那样工作并执行属性占位符解析,它会更简洁,并且比字段初始化器更有优势,能够自动为属性记录一个合理的默认值。