Freemarker模板if else判断失效且报myData.action空引用异常
触发原因
该报错本质是FreeMarker无法访问myData对象的action属性,而非值比较逻辑错误,常见触发场景如下:
myData对应的Java实体类没有为action字段编写符合JavaBean规范的公共getter方法。FreeMarker依赖getter方法访问对象属性,仅声明字段无法被模板识别。- 循环遍历的
myDataList中存在部分实例的action字段为null,你调试时仅验证了部分实例,未覆盖所有循环项。FreeMarker默认对空值/不存在的属性直接抛出该异常。 - 若
myData是Map类型存储的数据,存在key大小写不匹配问题,比如实际key为大写Action,模板中写的是小写action。 - 数据传递到FreeMarker上下文的过程中
action字段丢失,比如序列化时加了@JsonIgnore忽略了该字段,或者构造myData实例时未给action赋值。
解决办法
按以下步骤排查修复即可:
- 首先检查Java实体类的getter方法,确认存在
public Integer getAction()方法,方法名首字母必须大写,无拼写错误。如果用Lombok生成getter,确认字段上没有加@Getter(AccessLevel.NONE)这类限制注解。 - 临时添加属性存在性校验定位问题,修改模板代码如下:
<#list myDataList as myData> <p> <#-- ?? 是FreeMarker的属性存在性判断符,判断属性是否存在且不为null --> <#if myData.action??> <#if myData.action == 0>Added by <#else>Removed from </#if> <#else> 调试:当前实例action属性缺失,实例内容:${myData} </#if> </p> </#list>
- 如果业务允许
action为null,可设置默认值避免报错,示例代码:
<#-- !0 表示如果action不存在或为null,默认取值为0 --> <#if (myData.action!0) == 0>Added by <#else>Removed from </#if>
- 若
myData是Map类型,可改用方括号语法匹配实际key:
<#if myData['action'] == 0>Added by
- 最后检查数据传递逻辑,确认向FreeMarker上下文放入数据时,所有
myData实例的action字段都已正确赋值,没有被序列化逻辑过滤。
内容的提问来源于stack exchange,提问作者sonic boom
相关产品推荐
相关产品推荐

