我有一个属性文件,其中包含带有键的地图,每个键都有多个值,如下所示
//properties.yml
myMap:
key1: value1, value2
key2: value1, value2, value3
使用Spring属性类读取myMap
相当容易,如下所示:
@Configuration
@ConfigurationProperties
public class MyConfiguration {
private Map<String, List<String>> myMap;
public Map<String, List<String>> getMyMap() {
return myMap;
}
public void setMyMap(Map<String, List<String>> myMap) {
this.myMap = myMap;
}
}
但是,对于一个简单的任务来说,这感觉像很多代码。我想知道是否有一种方法可以使用Spring的@Value
注释来实现相同的目的?我试图使它无法成功运行,尝试类似
@Value("${myMap}")
private Map<String, List<String>> myMap;
我认为可能需要SPEL,但我不确定如何
答案 0 :(得分:1)
可以使用@Value注入地图(但也许您需要修改YAML):
@Value("#{${myMap}}")
private Map<String, List<String>> myMap;
但是,建议使用@ConfigurationProperties而不是@Value(特别是如果您使用YAML格式,Spring boot使用SnakeYAML来解析YAML文件)
加载到地图时不需要二传手:
@ConfigurationProperties
public class MapProperties {
private Map<String, List<String>> myMap = new HashMap<>();
public Map<String, List<String>> getMyMap() {
return this.myMap;
}
}
答案 1 :(得分:1)
@value
注释不支持Relaxed binding
docs,而仅支持SpEL evaluation
如果您为自己的组件定义了一组配置键,我们建议您将它们组合在以@ConfigurationProperties注释的POJO中。您还应该注意,由于@Value不支持宽松的绑定,因此如果需要使用环境变量来提供值,则它不是一个很好的选择。
最后,虽然您可以在@Value中编写SpEL表达式,但不会从应用程序属性文件中处理此类表达式。
我建议您使用@ConfigurationProperties
doc1 doc2
示例
对于Map属性,可以绑定从多个来源绘制的属性值。但是,对于多个源中的同一属性,将使用优先级最高的属性。下面的示例从AcmeProperties公开地图:
@ConfigurationProperties("acme")
public class AcmeProperties {
private final Map<String, MyPojo> map = new HashMap<>();
public Map<String, MyPojo> getMap() {
return this.map;
}
}
yml
acme:
map:
key1:
name: my name 1
description: my description 1