spring ConfigurationProperties -如何使用组和默认属性值创建配置

u91tlkcl  于 2023-04-10  发布在  Spring
关注(0)|答案(1)|浏览(289)

我使用Sping Boot 应用程序和Java8。

问题描述

最常见的需要是创建多个my.externalsystem.connection属性的Java表示,并使用@ConfigurationProperties注解将它们分组。我有application.properties文件,该文件目前缺少任何my.externalsystem.connection属性来模拟错误的配置(有人忘记将属性放在属性文件中,然后应该使用默认的属性值)。缺少的特定属性是my.externalsystem.connection.enabled=false (default should be true)将来会有更多前缀为my.externalsystem.connection的属性。
因为会有很多my.externalsystem.connection属性,我会像下面的Java对象一样创建属性组:

我的Java类表示属性:

@Configuration
@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对象在运行时为null。为什么它没有使用默认值创建?我需要这个类使用默认值(my.externalsystem.connection.enabled的true是默认值)。
有人能帮忙吗?先谢了。

9avjhtql

9avjhtql1#

您将缺少ConnectionProperties的默认构造函数来示例化类并Map属性(如果缺少)。
不确定是否或如何使用@NoArgsConstructor@AllArgsConstructor将其转换为Lombok,但这应该可以工作:

@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;
        }
    }
}

在这个例子中,如果属性丢失,它将只使用构造函数的默认值,如果属性存在,它将覆盖它。

相关问题