如何在spring中使用@configurationproperties加载name-value属性

zaqlnxep  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(419)

我的属性文件的内容如下
config.entry[0]=x-frame-options,sameorigin
config.entry[1]=内容安全策略,框架“self”
我想把它加载到一个config类中,在那里我可以把逗号分隔的值作为键、值对加载到一个集合中。如何在spring3中使用@configurationproperties实现这一点?
entries=config.getentry()应该为我提供一个集合,以便我可以迭代并获取属性文件中定义的名称-值对列表

for(Entry<String,String> index : config.getEntry().entryset()) {
          index.getKey(); // Should Give - X-FRAME-OPTIONS
          index.getValue(); // Should Give - SAMEORIGIN
}

我应该如何定义将以这种方式与属性文件中的值自动关联的配置类?
对于属性“entry[0]”,以下实现引发了spring异常“cannot convert value of type[java.lang.string]to required type[java.util.map]”:找不到匹配的编辑器或转换策略]

@Component
@ConfigurationProperties("config")
public class MyConfiguration {

  private Map<String,Map<String,String>> entry = new LinkedHashMap<String,Map<String,String>>();

  //getter for entry

  //setter for entry
}
jvlzgdj9

jvlzgdj91#

你可以分两部分来做,第一部分是简单的 @ConfigurationProperties 这种方式:

@ConfigurationProperties(prefix = "config")
@Component
public class SampleConfigProperties {

    private List<String> entry;

    public List<String> getEntry() {
        return entry;
    }

    public void setEntry(List<String> entry) {
        this.entry = entry;
    }
}

这将干净地将您的属性加载到 entry 你的领域 SampleConfigProperties 天生的。接下来要做的不是spring的本机操作—您希望逗号分隔列表中的第一个字段是Map中的键,这是一个自定义逻辑,您可以使用 @PostConstruct 这样的逻辑,看看我怎么还在用spring的 conversionService 转换逗号分隔的 StringList<String> :

import javax.annotation.PostConstruct;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ConfigurationProperties(prefix = "config")
@Component
public class SampleConfigProperties {

    @Autowired
    private ConversionService conversionService;
    private List<String> entry;

    private Map<String, String> entriesMap;

    public List<String> getEntry() {
        return entry;
    }

    public void setEntry(List<String> entry) {
        this.entry = entry;
    }

    public Map<String, String> getEntriesMap() {
        return entriesMap;
    }

    public void setEntriesMap(Map<String, String> entriesMap) {
        this.entriesMap = entriesMap;
    }

    @PostConstruct
    public void postConstruct() {
        Map<String, String> entriesMap = new HashMap<>();
        for (String anEntry: entry) {
            List<String> l = conversionService.convert(anEntry, List.class);
            entriesMap.put(l.get(0), l.get(1));
        }
        this.entriesMap = entriesMap;
    }

}
bejyjqdl

bejyjqdl2#

你可以试试 @PostConstruct 将在构造的bean之后调用的注解。您可以在这里加载配置文件并根据需要更新Map。
例如:

@Component
public class Config {
    private Map<String, String> entry = new LinkedHashMap<String, String>();

    @PostConstruct
    private void init() throws IOException {
        try (InputStream input = ClassUtils.getDefaultClassLoader().getResourceAsStream("config.properties")) {
            for (String line : IOUtils.readLines(input)) {
                // change the logic as per your need
                String[] keyValue = line.split("=")[1].split(",");
                entry.put(keyValue[0], keyValue[1]);
            }
        }
    }
}

相关问题