You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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写法更简洁:

  1. 编写配置类
@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;
    }
}
  1. 调整YAML配置层级
mymap:
  entries:
    key1: value1
    key2: value1
  1. 简化SpEL写法
@KafkaListener(topics = "#{myMapProperties.entries.keySet().toArray(new String[0])}",
        containerFactory = "kafkaListenerContainerFactory",
        autoStartup = "${kafka.enable}",
        concurrency = "1")

内容的提问来源于stack exchange,提问作者user2346013

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 13:24:05