使用Spring的@Value注入Map <string,list <string =“” >>

时间:2018-12-08 16:20:07

标签: spring spring-boot

我有一个属性文件,其中包含带有键的地图,每个键都有多个值,如下所示

//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,但我不确定如何

2 个答案:

答案 0 :(得分:1)

可以使用@Value注入地图(但也许您需要修改YAML):

@Value("#{${myMap}}")
private Map<String, List<String>> myMap;

但是,建议使用@ConfigurationProperties而不是@Value(特别是如果您使用YAML格式,Spring boot使用SnakeYAML来解析YAML文件)

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-typesafe-configuration-properties

加载到地图时不需要二传手:

@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