gpt4 book ai didi

spring - 使用@Value Spring Annotation 从.yaml 读取的属性映射的正确用法是什么

转载 作者:行者123 更新时间:2023-12-04 01:44:59 26 4
gpt4 key购买 nike

我通过以下方式从 Spring Boot 应用程序中的某些 .yaml 读取的 map 中注入(inject)了属性:

@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 所建议的那样)

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

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

但我想外部化属性

最佳答案

使用@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'}"

请注意 map 值周围的引号。在这种情况下,显然 Spring 将其从 String 中解析出来。

关于spring - 使用@Value Spring Annotation 从.yaml 读取的属性映射的正确用法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55715308/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com