java - 如何指定嵌套属性的默认值?

当我没有为 acme.security.roles 指定值时,以下代码会抛出 NPE:

@ConstructorBinding
@ConfigurationProperties("acme")
public class AcmeProperties {

    private final Security security;

    public AcmeProperties(Security security) {
        this.security = security;
    }

    public Security getSecurity() {
        return security;
    }

    public static class Security {

        private final List<String> roles;

        public Security(@DefaultValue("USER") List<String> roles) {
            this.roles = roles;
        }

        public List<String> getRoles() {
            return roles;
        }
    }
}
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(AcmeProperties.class)
public class MyConfiguration {

@Bean HttpClientConnectionManager httpClientConnectionManager(AcmeProperties acmeProperties) {

        Security security = acmeProperties.getSecurity();

        security.getRoles(); // throws NPE

        return new PoolingHttpClientConnectionManager();
    }
}

使 spring boot 使用默认 roles 值实例化 Security 对象的正确方法是什么?我是否应该使用 @DefaultValue 和 SPEL 以使其工作?

最佳答案

试试这个。这应该工作。

@Configuration
@ConfigurationProperties(prefix = "acme")
public class AcmeProperties {

    private Security security;

    public Security getSecurity() {
        return security;
    }

    public void setSecurity(Security security) {
        this.security = security;
    }

    @PostConstruct
    public void initDefaultValues() {
        if(security == null) {
            security = new Security();
        }
    }
}

安全类看起来像这样

public class Security {

    private List<String> roles = Lists.newArrayList("USER");

    public List<String> getRoles() {
        return roles;
    }

    public void setRoles(List<String> roles) {
        this.roles = roles;
    }
}

https://stackoverflow.com/questions/60935878/

相关文章:

visual-studio - phpcs — Wordpress 编码标准在 Visual Stu

angular - 如何使用 angular 在 s3 中使用带有多个文件的预签名 url

spring-boot - 由于 Content-Security-Policy,Swagger U

python - tf.data 与 tf.keras.preprocessing.image.Im

python - 与另一个物体接触时改变物体颜色

encryption - 为什么使用 JSON Web Tokens (JWT) 而不是普通加密

r - 为什么 ivreg 函数会产生奇怪的错误

c# - TransactionScope 抛出异常 "This platform does not

macos - MAC 上 .net 核心应用程序的核心签名 + 强化运行时

laravel - 混合内容,此请求已被阻止;内容必须通过 HTTPS 提供,Laravel