Spring Boot ConfigurationProperties绑定Map<String,List<Query>>失败问题
问题解决:Spring Boot @ConfigurationProperties 绑定失败
问题根源
你的YAML配置结构与Java类的类型不匹配:
- 配置中每个列表元素多了一层
query节点,但Query类直接包含matchType属性; units定义为Map<String, List<Query>>,对应的配置应该是键值对形式,每个键对应一个Query对象的列表,而非嵌套query的结构。
解决方案
方案1:调整YAML配置(推荐)
移除多余的query层,让列表元素直接对应Query类的属性:
com: test: app: units: unit: # 此处为Map的key,可自定义命名 - matchType: "sadas" - matchType: "sadas"
调整后,units Map中会生成一个key为unit的条目,其值是包含两个Query对象的列表,每个对象的matchType属性会被正确绑定。
方案2:调整Java类结构(适配现有配置)
如果需要保留配置中的query层,新增一个包装类来匹配配置结构:
public class UnitEntry { private Query query; // 必须添加getter和setter方法 public Query getQuery() { return query; } public void setQuery(Query query) { this.query = query; } }
然后修改UnitsConfiguration的属性类型:
@Component @ConfigurationProperties(prefix = "com.test.app") public class UnitsConfiguration { private Map<String, List<UnitEntry>> units; // 必须添加getter和setter方法 public Map<String, List<UnitEntry>> getUnits() { return units; } public void setUnits(Map<String, List<UnitEntry>> units) { this.units = units; } }
此时配置中的unit[0].query.matchType会正确绑定到UnitEntry的query属性下的matchType字段。
注意:所有相关类必须提供完整的getter和setter方法,Spring Boot的
@ConfigurationProperties依赖这些方法完成属性绑定。
内容的提问来源于stack exchange,提问作者Gourav
相关产品推荐
相关产品推荐

