我使用的是Spring Boot应用程序和Java8。
问题描述
最一般的需求是创建多个my.externalsystem.connection属性的Java表示,并使用@ConfigurationProperties注释对它们进行分组。我有申请。属性文件,目前缺少任何my.externalsystem.connection
属性来模拟错误的配置(有人忘记在属性文件中放置属性,然后应该使用默认属性值)。具体缺少的属性是my.externalsystem.connection.enabled=false (default should be true)
,将来会有更多的属性以my.externalsystem.connection
为前缀。
因为将有许多my.externalsystem.connection
属性,我将创建属性组,就像下面的Java对象:
我的Java类表示属性:
@Configuration
@Component
@ConfigurationProperties(prefix = "my.externalsystem")
@Getter
@Setter
public class MyConfiguration {
private ConnectionProperties connection;
@Getter
@Setter
public static class ConnectionProperties {
public ConnectionProperties (@DefaultValue("true") boolean enabled) {
this.enabled = enabled;
}
private boolean enabled;
}
}
运行时的问题
当我在属性文件中使用my.externalsystem.connection.enabled=true or false
运行它时,它正确地读取值并且一切正常工作。但是,当属性文件中缺少my.externalsystem.connection.enabled
时,connection
对象在运行时为空。为什么不使用默认值创建它?我需要这个类的工作与默认值(true为my.externalsystem.connection.enabled
是默认值)。
有人能帮忙吗?提前谢谢。
您缺少ConnectionProperties
的默认构造函数来实例化类并在缺少时映射属性。
不确定是否或如何用@NoArgsConstructor
和@AllArgsConstructor
将其转换为龙目鱼,但这应该可以工作:
@Configuration
@ConfigurationProperties(prefix = "my.externalsystem")
@Getter
@Setter
public class MyConfiguration {
private ConnectionProperties connection = new ConnectionProperties();
@Getter
@Setter
public static class ConnectionProperties {
private boolean enabled;
public ConnectionProperties() {
this.enabled = true;
}
}
}
在这个例子中,如果属性缺失,它将使用构造函数的默认值,如果属性存在,它将覆盖它。