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

Freemarker遍历集合报InvalidReferenceException找不到recipient.phone如何解决

异常根本原因
  • 最核心的问题是你定义的Recipient是私有非静态内部类:
    哪怕Lombok的@Data已经为phone字段生成了public的getter方法,Freemarker通过反射访问私有内部类的成员时,会受到Java访问权限的限制,无法正常调用getter方法获取值,因此抛出recipient.phone为null或缺失的异常。
  • 次要可能原因:你没有开启Lombok的注解处理器,导致@Data没有实际生成getter/setter方法,Freemarker找不到对应属性的getter。
解决方案

按照优先级推荐以下处理方式:

  • 调整Recipient类的访问修饰符
    将私有非静态内部类改为public static的静态内部类,或者直接抽成独立的公共Java类,确保Freemarker可以正常访问类的getter方法:
@Data
public static class Recipient {
    private String phone;
    private String languageValue;
}

该方案改造成本最低,也符合Freemarker的属性访问规范。

  • 转换集合为Map结构传递
    如果你不能调整Recipient的类定义,可以在向dataModel塞值前,把Recipient集合转换成Map集合,Freemarker访问Map的键时无权限限制:
// 转换Recipient集合为Map集合
List<Map<String, Object>> mapList = new ArrayList<>();
for (Recipient r : recipientList) {
    Map<String, Object> item = new HashMap<>();
    item.put("phone", r.getPhone());
    item.put("languageValue", r.getLanguageValue());
    mapList.add(item);
}
dataModel.put("recipients", mapList);
  • 临时规避报错
    如果需要先避免服务直接抛出异常,可以在模板中使用Freemarker默认值语法兜底,属性获取失败时会用默认值填充:
"address": "${recipient.phone!''}"

注意该方案只是规避报错,不能解决属性无法正常读取的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:15:04