从.yaml使用@Value Spring Annotation

时间:2019-04-16 19:23:39

标签: spring spring-boot dependency-injection yaml spring-annotations

我已经通过以下方式从从Spring Boot应用程序的.yaml中读取的映射中注入了属性:

@Value("#{${app.map}}")
private Map<String, String> indexesMap = new HashMap<>();

但都不是

app:
    map: {Countries: 'countries.xlsx', CurrencyRates: 'rates.xlsx'} 
    //note values in single quotes  

nor
app:
    map: {Countries: "countries.xlsx", CurrencyRates: "rates.xlsx"}

(如https://www.baeldung.com/spring-value-annotation所述)

app:
    map:
      "[Countries]": countries.xslx
      "[CurrencyRates]": rates.xlsx

(根据https://stackoverflow.com/a/51751123/2566304的建议)

有效-我不断收到消息“自动连接依赖项注入失败;嵌套异常是java.lang.IllegalArgumentException:无法解析占位符'

同时可行:

@Value("#{{Countries: 'countries.xlsx', CurrencyRates: 'rates.xlsx'}}")
private Map<String, String> indexesMap = new HashMap<>();

但是我想外部化属性

1 个答案:

答案 0 :(得分:3)

根据您所链接问题的答案之一,使用@ConfigurationProperties

@Bean(name="AppProps")
@ConfigurationProperties(prefix="app.map")
public Map<String, String> appProps() {
    return new HashMap();
}

然后

@Autowired
@Qualifier("AppProps")
private Map<String, String> props;

可以使用配置

app:
  map:
    Countries: 'countries.xlsx'
    CurrencyRates: 'rates.xlsx'

编辑:@Value注释也可以,但是您必须在YAML中将其视为字符串:

@Value("#{${app.map}}")
private Map<String, String> props;

app:
  map: "{Countries: 'countries.xlsx', CurrencyRates: 'rates.xlsx'}"

请注意地图值周围的引号。在这种情况下,显然Spring会从String中解析出它。