Spring中如何动态读取List类型的YAML配置属性
Spring中动态读取YAML数组内指定key配置的方法
在Spring框架中,普通配置属性可以直接通过env.getProperty(key)方法读取。
比如application.yaml写了如下配置:
test: "a"
直接用下面的代码就能拿到值:
val test = env.getProperty("test")
如果YAML是数组结构,比如:
test: - a: "a" - b: "b"
想要动态读取test数组中key为a对应的配置值,直接写env.getProperty("test[a]")是读不到的。
踩坑核心原因:
getProperty("xxx[key]")的访问语法仅适用于xxx本身是Map结构的场景。对于List/数组类型的配置,Spring原生只支持test[0]、test[1]这类按下标索引的访问方式——比如上面的示例里env.getProperty("test[0].a")可以正常读到值"a",但如果不知道目标key对应的元素下标,就没法直接通过属性表达式定位。
要实现无下标的动态读取,直接用通用写法即可:
- 先把整个数组结构读取为
List<Map>类型,再遍历匹配目标key
// 读取整个test数组结构,做防空处理 val testList = env.getProperty("test", List::class.java) as? List<Map<String, Any>> ?: emptyList() // 遍历找到第一个包含key=a的元素,取出对应值 val aValue = testList.firstNotNullOfOrNull { it["a"] }
如果业务里频繁需要做这类数组内的key匹配,也可以在项目启动时自定义属性后置处理器,提前把这类数组结构扁平化为可直接key访问的Map结构存入Environment,省去每次遍历的成本。普通业务场景下上面的遍历写法实现成本最低,兼容性也最好。
内容的提问来源于stack exchange,提问作者Sjoerd222888
相关产品推荐
相关产品推荐

