如何使用Spring的PropertiesConfigurationFactory读取yaml中的对象列表?

时间:2015-08-04 22:27:12

标签: java spring spring-boot

如果我有一组属性,我知道Springboot的轻松数据绑定器将读入属性列表(或yaml)并填充匹配对象。像这样:

Properties props = new Properties();
props.put("devices.imports[0]","imp1");
props.put("devices.imports[1]","imp2");
props.put("devices.definitions[0].id","first");
props.put("devices.definitions[1].id", "second");

DeviceConfig conf = new DeviceConfig();
PropertiesConfigurationFactory<DeviceConfig> pcf = new PropertiesConfigurationFactory<>(conf);
pcf.setProperties(props);

conf = pcf.getObject();
assertThat(conf.getDefinitions()).hasSize(2); //Definitions is coming in as 0 instead of the expected 2

DeviceConfig如下所示:

@ConfigurationProperties(prefix="devices")
public class DeviceConfig {

    private List<String> imports = new ArrayList<>();
    private List<DeviceDetailsProperties> definitions = new ArrayList<>();

    public List<String> getImports() {
        return this.imports;
    }

    public List<DeviceDetailsProperties> getDefinitions() {
        return definitions;
    }

    public void setImports(List<String> imports) {
        this.imports = imports;
    }

    public void setDefinitions(List<DeviceDetailsProperties> definitions) {
        this.definitions = definitions;
    }
}

DeviceDetailsProperties只有一个带有getter / setter的id字段。

奇怪的是,定义(对象)或导入(字符串)都没有填充。

使用SpringBoot 1.2.0.RELEASE

1 个答案:

答案 0 :(得分:1)

以这样的手动方式使用PropertiesConfigurationFactory时,它不会自动使用注释中的prefix值。

像这样添加targetName

pcf.setTargetName("devices");

更正后的代码为:

Properties props = new Properties();
props.put("devices.imports[0]","imp1");
props.put("devices.imports[1]","imp2");
props.put("devices.definitions[0].id","first");
props.put("devices.definitions[1].id", "second");

DeviceConfig conf = new DeviceConfig();
PropertiesConfigurationFactory<DeviceConfig> pcf = new PropertiesConfigurationFactory<>(conf);
pcf.setProperties(props);
pcf.setTargetName("devices"); // <--- Add this line

conf = pcf.getObject();
assertThat(conf.getDefinitions()).hasSize(2);