使用Spring的@Value注入Map <String,List <String >>

Dra*_*MTN 5 spring spring-boot

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

//properties.yml
myMap:
  key1: value1, value2
  key2: value1, value2, value3
Run Code Online (Sandbox Code Playgroud)

myMap使用Spring属性类很容易阅读,如下所示:

@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;
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,对于一个简单的任务,这感觉像很多代码。我想知道是否有一种方法可以使用Spring的@Value注解来实现相同的目的?我试图使它无法成功工作,尝试类似

@Value("${myMap}")
private Map<String, List<String>> myMap;
Run Code Online (Sandbox Code Playgroud)

我认为可能需要SPEL,但我不确定如何

Ste*_*cek 4

要使用 @Value 注入映射,您可以执行以下操作(但也许您需要修改 YAML):

@Value("#{${myMap}}")
private Map<String, List<String>> myMap;
Run Code Online (Sandbox Code Playgroud)

但是,鼓励使用@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我有一个具有相同结构的“application.properties”文件,“myMap”应该是什么样子? (2认同)