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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:51:27