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

Java 如何指定嵌套属性的默认值?,java,spring-boot,Java,Spring Boot,当我没有为acme.security.roles指定值时,以下代码将抛出NPE: @ConstructorBinding @ConfigurationProperties("acme") public class AcmeProperties { private final Security security; public AcmeProperties(Security security) { this.security = security; }

当我没有为
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;
        }
    }
}

使用默认的
角色
值使spring boot实例化
安全性
对象的正确方法是什么?我是否应该使用
@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;
    }
}
公共类安全{
私有列表角色=Lists.newArrayList(“用户”);
公共列表getRoles(){
返回角色;
}
public void setRoles(列出角色){
this.roles=角色;
}
}

为什么不这样做呢
私有列表角色=Lists.newArrayList(“用户”)
。如果在属性文件中找不到任何内容,它将默认为该值。在这种情况下,我将不得不使用
@DefaultValue(“用户”)
使spring boot为
角色生成具有默认值的spring-configuration-metadata.json,谢谢。我知道使用可变类可以达到预期效果。但如何用不变的方法实现同样的效果呢?
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;
    }
}