Spring Boot中YAML配置无法注入Map的问题求助
Spring Boot配置映射为空的解决方法
1. 修复application.yml的格式错误
原配置中,"001"、"002"作为YAML的键,后面缺少冒号,导致YAML解析器无法识别为合法的键值对结构。正确的配置格式如下:
org: "001": "001": name: somename location: somelocation "002": "001": name: somename location: somelocation
2. 修正配置类的绑定路径问题
你的MyData类使用了@ConfigurationProperties(prefix = "org"),但类内字段名也是org,这会导致绑定路径变为org.org,与实际配置的org节点不匹配,因此无法映射数据。有两种修复方式:
方式一:移除prefix,直接绑定根节点
修改MyData类,去掉prefix属性,让类内的org字段直接绑定配置文件的org节点:
@Component @ConfigurationProperties public class MyData { private Map<String, Map<String, Metadata>> org = new HashMap<>(); // 正确的Getter和Setter public Map<String, Map<String, Metadata>> getOrg() { return org; } public void setOrg(Map<String, Map<String, Metadata>> org) { this.org = org; } }
方式二:修改字段名,匹配prefix路径
保留prefix = "org",将类内字段名改为非org的名称(比如data),这样配置文件中org节点下的内容会直接绑定到该字段:
@Component @ConfigurationProperties(prefix = "org") public class MyData { private Map<String, Map<String, Metadata>> data = new HashMap<>(); // 正确的Getter和Setter public Map<String, Map<String, Metadata>> getData() { return data; } public void setData(Map<String, Map<String, Metadata>> data) { this.data = data; } }
注意:如果用这种方式,控制器中需要同步修改为mydata.getData()。
3. 确保Metadata类的Getter/Setter正确
确认Metadata类的name和location字段有public的Getter和Setter方法,Spring Boot依赖这些方法完成属性注入:
public class Metadata { private String name; private String location; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLocation() { return location; } public void setLocation(String location) { this.location = location; } }
4. 引入配置处理器依赖(可选但推荐)
添加spring-boot-configuration-processor依赖,帮助IDE提供配置提示,并确保配置绑定逻辑更稳定:
Maven依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
Gradle依赖
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
完成以上修改后,重启项目即可正常获取配置数据。
内容的提问来源于stack exchange,提问作者Thiagarajan Ramanathan
相关产品推荐
相关产品推荐

