Spring 引导的不可变配置

Immutable configuration of Spring boot

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

我的数据配置class是:

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

    @Value.Redacted
    String clientSecret();
}

而主配置class设置为

@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 class 的内容可以解决问题,但我更喜欢不可变对象。有什么方法可以说服 Spring 与 Immutables 库生成的 classes 交互吗?

库对 modifiable classes 的支持提供了一种非常接近我所搜索的方法。

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

    @Value.Redacted
    String clientSecret();
}

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

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

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

    public AuthConfig getAuth() {
        return auth;
    }
}

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