首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring中嵌套配置属性的前缀

spring中嵌套配置属性的前缀
EN

Stack Overflow用户
提问于 2018-05-15 16:44:46
回答 2查看 9.4K关注 0票数 6

Spring boot 2.0.0.Relase

我有属性类:

代码语言:javascript
复制
@Configuration
@ConfigurationProperties(prefix="person")
public class PersonProperties {

    private AddressProperties addressProperties;

    public AddressProperties getAddressProperties() {
        return addressProperties;
    }

    public void setAddressProperties(final AddressProperties addressProperties) {
        this.addressProperties = addressProperties;
    }

    public static class AddressProperties {

        private String line1;

        public String getLine1() {
            return line1;
        }

        public void setLine1(final String line1) {
            this.line1 = line1;
        }
    }

}

application.yml

代码语言:javascript
复制
person:
  address:
    line1: line1OfAddress

它没有正确绑定,因为我的AddressProperties对象是null。当一个类与yml属性AddressProperties -> Address同名时,它工作得很好。我尝试添加带有前缀addressQualifierConfigurationProperties,但它不起作用。不幸的是,我在spring文档中找不到关于这个案例的有用信息。

如何为嵌套属性指定前缀?

EN

回答 2

Stack Overflow用户

发布于 2018-05-15 18:16:38

yaml / Property文件中定义的属性应与class中定义的变量匹配。将yaml文件更改为

代码语言:javascript
复制
person:
  # addressProperties will also work here
  address-properties:
    line1: line1OfAddress

或者将bean定义为

代码语言:javascript
复制
@Configuration
@ConfigurationProperties(prefix = "person")
public class PersonProperties {

    // here variable name doesn't matter, it can be addressProperties as well
    // setter / getter should match with properties in yaml
    // i.e. getAddress() and setAddress()
    private AddressProperties address;

    public AddressProperties getAddress() {
        return address;
    }

    public void setAddress(AddressProperties address) {
        this.address = address;
    }
}

如果希望在address下获取所有属性,而不在单独的bean中定义它们,则可以将PersonProperties类定义为

代码语言:javascript
复制
@Configuration
@ConfigurationProperties(prefix = "person")
public class PersonProperties {

    private Map<String, Object> address;

    public Map<String, Object> getAddress() {
        return address;
    }

    public void setAddress(Map<String, Object> address) {
        this.address = address;
    }
}

这里的PersonProperties#address将包含{line1=line1OfAddress}

现在address下的所有属性都将位于Map中。

票数 3
EN

Stack Overflow用户

发布于 2018-11-27 22:59:18

您可以简单地取消这两个类的嵌套,允许每个类都有自己的前缀。第一类:

代码语言:javascript
复制
@Configuration
@ConfigurationProperties(prefix="person")
public class PersonProperties {

    private AddressProperties addressProperties;

    public AddressProperties getAddressProperties() {
        return addressProperties;
    }

    public void setAddressProperties(final AddressProperties addressProperties) {
        this.addressProperties = addressProperties;
    }
}

第二类:

代码语言:javascript
复制
@Configuration
@ConfigurationProperties(prefix="person.address")
public class PersonAddressProperties {

    private String line1;

    public String getLine1() {
        return line1;
    }

    public void setLine1(final String line1) {
        this.line1 = line1;
    }
}

编辑:正如注释中所指出的,如果一段代码需要同时引用这两组属性,则必须同时注入这两个类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50345888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档