首页 > 解决方案 > Spring boot 的不可变配置

问题描述

我正在尝试找到一种方法来使用Immutables 库来创建数据类来保存我的 Spring Boot 应用程序的配置。

我的数据配置类是:

@Value.Immutable
@JsonDeserialize(as = ImmutableAuthConfig.class)
public interface AuthConfig {
    String domain();
    String clientId();

    @Value.Redacted
    String clientSecret();
}

而主配置类设置为

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties
public class Config {
    private ImmutableAuthConfig auth;

    public AuthConfig getAuth() {
        return auth;
    }

    public void setAuth(ImmutableAuthConfig auth) {
        this.auth = auth;
    }
}

我尝试了一些使用其中一个ImmutableAuthConfig或仅AuthConfig作为一个字段的变体,但没有任何改善这种情况。配置没有被拾取,并且在应用程序启动后auth配置的字段仍然存在。null

用传统的 POJO替换AuthConfig类的内容可以解决问题,但我更喜欢不可变对象。有什么方法可以说服 Spring 与 Immutables 库生成的类进行交互?

标签: javaspring-bootimmutables-library

解决方案


该库对可修改类的支持提供了一种与我正在寻找的方法非常接近的方法。

@Value.Modifiable
public interface AuthConfig {
    String domain();
    String clientId();

    @Value.Redacted
    String clientSecret();
}

这将创建一个类ModifiableAuthConfig,该类提供一个满足 Spring 的接口JavaBeanBinder,用于反序列化配置。

此外,还需要提供一个可变AuthConfig类的实例,然后 Spring 可以填充该实例:

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties
public class Config {
    private ImmutableAuthConfig auth = ModifiableAuthConfig.create();

    public AuthConfig getAuth() {
        return auth;
    }
}

随后可以通过AuthConfig不提供变异方法的接口对加载的配置进行任何使用。


推荐阅读