简体   繁体   中英

Immutable configuration of Spring boot

I'm trying to find a way to use the Immutables library to create data classes for holding the configuration of my Spring Boot application.

My data configuration class is:

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

    @Value.Redacted
    String clientSecret();
}

While the main configuration class is set up as

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

    public AuthConfig getAuth() {
        return auth;
    }

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

I've tried some variations of using either ImmutableAuthConfig or just AuthConfig as a field, but nothing improved the situation. The configuration did not get picked up, and the auth field of the configuration remains null after application start-up.

Replacing the contents of the AuthConfig class with a traditional POJO solves the issue, but I would prefer an immutable object. Is there any way to convince Spring to interface with the classes generated by the Immutables library?

The library's support for modifiable classes supplies an approach that is pretty close to what I was searching for.

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

    @Value.Redacted
    String clientSecret();
}

This creates the class ModifiableAuthConfig which provides an interface satisfying Spring's JavaBeanBinder , which is used for deserializing the configuration.

It's furthermore necessary to supply an instance of the mutable AuthConfig class, which Spring can then populate:

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

    public AuthConfig getAuth() {
        return auth;
    }
}

Any use of the loaded configuration can subsequently happen through the AuthConfig interface, which doesn't provide mutating methods.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM