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

Spring 2.7.x下使用@Value读取Map配置报错问题

Spring 2.7.x 读取嵌套Map配置失败问题

场景说明

在Spring 2.7.x环境中,尝试将application.yml中的嵌套Map配置读取到单个Map字段中,初始配置如下:

my:
  map:
    propertyA1:
      firstProp: some1
      secondProp: some2
    propertyA2:
      firstProp: some1
      secondProp: some2

最初在Controller中使用@Value注解注入:

@Value("${my.map}")
private Map<String, Object> myMap;

尝试过的调整方案

调整后的配置格式

试过两种配置写法:
格式一:

my:
  map:
    propertyA1: '{firstProp: some1, secondProp: some2}'
    propertyA2: '{firstProp: some1, secondProp: some2}'

格式二:

my:
  map:
    propertyA1: {firstProp: some1, secondProp: some2}
    propertyA2: {firstProp: some1, secondProp: some2}

不同的@Value注入写法

尝试了多种注入方式:

@Value("#{${my.map}}")
private Map<String, Object> myMap;

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

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

报错情况

每次启动都会触发BeanInstantiationException导致应用崩溃。使用Map<String , Map<String,String>>时的核心错误为无法解析占位符"my.map",堆栈信息片段如下:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'changeStreamController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'my.map' in value "${my.map}"
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:405) ~[spring-beans-5.3.23.jar:5.3.23]
    ...(省略其余堆栈内容)

解决方法

方法一:使用@ConfigurationProperties注入(推荐)

Spring官方推荐用@ConfigurationProperties绑定复杂嵌套配置,比@Value更适配多层Map结构:

  1. 创建配置类:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Map;

@Component
@ConfigurationProperties(prefix = "my")
public class MyMapProperties {
    private Map<String, Map<String, String>> map;

    // Getter和Setter
    public Map<String, Map<String, String>> getMap() {
        return map;
    }

    public void setMap(Map<String, Map<String, String>> map) {
        this.map = map;
    }
}
  1. 在Controller中注入配置类:
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;

@RestController
public class ChangeStreamController {
    @Resource
    private MyMapProperties myMapProperties;

    // 使用时直接调用myMapProperties.getMap()获取嵌套Map
}

方法二:修正@Value的SpEL写法(不推荐)

如果一定要用@Value,需确保配置格式与SpEL表达式匹配,针对初始嵌套YAML配置,可通过SpEL引用配置绑定器:

@Value("#{@configurationPropertiesBinder.get('my.map')}")
private Map<String, Map<String, String>> myMap;

这种方式局限性大,不如@ConfigurationProperties直观健壮。

问题根源

  • @Value("${my.map}")无法直接解析嵌套YAML Map,因为${my.map}对应复杂嵌套结构,而非简单字符串或基本类型。
  • @Value("#{${my.map}}")会尝试把my.map内容作为SpEL表达式解析,但初始嵌套YAML格式不符合SpEL的Map语法;即使调整为{key:value}格式,也可能因YAML转义规则导致解析失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:35:00