Spring Boot的不变配置

Hen*_*sen 5 java spring-boot immutables-library

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

我的数据配置类是:

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

    @Value.Redacted
    String clientSecret();
}
Run Code Online (Sandbox Code Playgroud)

当主配置类设置为

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

    public AuthConfig getAuth() {
        return auth;
    }

    public void setAuth(ImmutableAuthConfig auth) {
        this.auth = auth;
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过使用“ ImmutableAuthConfig或”或“仅” AuthConfig作为字段的一些变体,但没有任何方法可以改善这种情况。尚未获取配置,并且在应用程序启动后auth仍保留配置字段null

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

Hen*_*sen 1

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

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

    @Value.Redacted
    String clientSecret();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

    public AuthConfig getAuth() {
        return auth;
    }
}
Run Code Online (Sandbox Code Playgroud)

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