Freemarker模板能否用.get()?Velocity转Freemarker代码问题排查
问题分析与修正方案
转换正确性判断
你的Freemarker转换不正确,这也是代码始终进入else分支的核心原因。
问题点拆解
原Velocity代码中,$frm_BenefitIcons.get("$beni.benefitIconNo")的逻辑是:先解析$beni.benefitIconNo的实际值,再将该值作为参数传入get()方法,判断返回结果是否非空。
而你写的Freemarker代码存在两个关键错误:
- 错误地将
beni.benefitIconNo用${}包裹后作为字符串参数传给get(),这会导致传入的是类似"${beni.benefitIconNo}"的字面量字符串,而非变量的实际值。 ??的位置错误,应该直接判断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
相关产品推荐
相关产品推荐

