FreeMarker遍历YAML复合对象序列无法获取baseurl属性问题
问题根因
你的YAML结构中,profiles序列下的每一个元素都不是直接携带baseurl、baseport属性的平面对象,而是仅包含1个键值对的Map结构:键为环境名(dev/uat/prod),对应的值才是存储了baseurl、baseport的配置对象。
你直接调用n.baseurl时,FreeMarker会在当前的单键Map上找baseurl键,自然找不到值;而map.project.profiles[n].baseurl的写法错误在于,序列的下标必须是数字类型,你传入的n是Map类型的元素,不是合法下标。
解决方案
你可以根据实际需求选以下两种方式,不需要修改原有YAML结构:
方式1:仅需读取配置属性,不需要获取环境名
直接提取每个单键Map的值序列的第一个元素,就是对应环境的配置对象:
<#list map.project.profiles as n> <#assign config = n?values?first> 索引:${n?index} 地址:${config.baseurl} 端口:${config.baseport} </#list>
方式2:需要同时获取环境名和对应配置
遍历每个单键Map的键值对,同时拿到环境名和配置内容:
<#list map.project.profiles as n> <#list n?keys as envName> 索引:${n?index} 环境名:${envName} 地址:${n[envName].baseurl} 端口:${n[envName].baseport} </#list> </#list>
更推荐的结构优化方案
你当前的YAML结构多嵌套了一层,维护和遍历都比较麻烦,建议把环境名作为配置对象的一个普通字段,调整后结构如下:
project: artifactId: foo groupId: org.foo profiles: - env: dev baseurl: localhost baseport: 8080 - env: uat baseurl: foo.com baseport: 8443 - env: prod baseurl: foo.com baseport: 8444
调整后你最初写的遍历逻辑就可以直接运行,不需要额外做结构转换:
<#list map.project.profiles as n> 索引:${n?index} 环境:${n.env} 地址:${n.baseurl} 端口:${n.baseport} </#list>
内容的提问来源于stack exchange,提问作者zamek 42
相关产品推荐
相关产品推荐

