Spring SpEL表达式中如何读取YAML配置Map的键用于KafkaListener配置
SpEL读取YAML配置Map键的解决方案
问题原因
报错是两个错误共同导致的:
- YAML配置里的Map格式非法,最后一个键值对多了多余逗号,导致Spring解析配置失败
- SpEL写法错误,
${mymap.keys}是查找名为mymap.keys的配置项,而非读取mymap这个Map的keys属性
第一步:修正YAML配置
推荐使用标准YAML缩进格式编写Map,避免JSON格式的语法错误:
mymap: key1: value1 key2: value1 kafka: enable: true
如果要使用JSON风格写法,需要去掉多余逗号:
mymap: {"key1": "value1", "key2": "value1"} kafka: enable: true
第二步:修正SpEL写法
你可以直接通过SpEL调用环境对象读取Map,不需要额外编写配置类,写法如下:
@KafkaListener(topics = "#{@environment.getProperty('mymap', java.util.Map).keySet().toArray(new String[0])}", containerFactory = "kafkaListenerContainerFactory", autoStartup = "${kafka.enable}", concurrency = "1")
如果需要逗号分隔的字符串格式,也可以用Stream拼接:
topics = "#{@environment.getProperty('mymap', java.util.Map).keySet().stream().collect(java.util.stream.Collectors.joining(','))}"
可选简化方案
如果你需要多处使用这个Map,可以通过@ConfigurationProperties注入到容器中,后续SpEL写法更简洁:
- 编写配置类
@ConfigurationProperties(prefix = "mymap") @Component public class MyMapProperties { private Map<String, String> entries; public Map<String, String> getEntries() { return entries; } public void setEntries(Map<String, String> entries) { this.entries = entries; } }
- 调整YAML配置层级
mymap: entries: key1: value1 key2: value1
- 简化SpEL写法
@KafkaListener(topics = "#{myMapProperties.entries.keySet().toArray(new String[0])}", containerFactory = "kafkaListenerContainerFactory", autoStartup = "${kafka.enable}", concurrency = "1")
内容的提问来源于stack exchange,提问作者user2346013
相关产品推荐
相关产品推荐

