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

Freemarker模板能否用.get()?Velocity转Freemarker代码问题排查

问题分析与修正方案

转换正确性判断

你的Freemarker转换不正确,这也是代码始终进入else分支的核心原因。

问题点拆解

原Velocity代码中,$frm_BenefitIcons.get("$beni.benefitIconNo")的逻辑是:先解析$beni.benefitIconNo的实际值,再将该值作为参数传入get()方法,判断返回结果是否非空。

而你写的Freemarker代码存在两个关键错误:

  1. 错误地将beni.benefitIconNo用${}包裹后作为字符串参数传给get(),这会导致传入的是类似"${beni.benefitIconNo}"的字面量字符串,而非变量的实际值。
  2. ??的位置错误,应该直接判断get()方法的返回值是否存在,而非对整个方法调用表达式加??。

修正后的Freemarker代码

方式一:保留get()方法调用

<#if frm_BenefitIcons.get((beni.benefitIconNo)!)??>
    <#assign xxx = frm_BenefitIcons.get((beni.benefitIconNo)!)?string?substring(12)?upper_case>
<#else>
    <#assign xxx = "">
</#if>

方式二:使用Freemarker Map简化语法(更推荐)

Freemarker支持直接用[]访问Map元素,和Velocity的写法更接近,代码更简洁:

<#assign iconValue = frm_BenefitIcons[(beni.benefitIconNo)!]>
<#if iconValue??>
    <#assign xxx = iconValue?string?substring(12)?upper_case>
<#else>
    <#assign xxx = "">
</#if>

关于get()方法的使用确认

Freemarker完全支持调用Java对象的get()方法,只要目标对象(比如这里的frm_BenefitIcons是Java Map)存在对应的get()方法,就可以正常使用,这部分你的理解是对的。

内容的提问来源于stack exchange,提问作者Hemanth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 14:15:13