【问题标题】:Can't print data from 2 layer ArrayList using Freemarker无法使用 Freemarker 从 2 层 ArrayList 打印数据
【发布时间】:2015-10-26 01:52:35
【问题描述】:

我在 Eclipse 中使用 freemarker 2.3.23 来生成报告。 下面是数据模型的代码:

ArrayList<Cell> namelist=new ArrayList<Cell>();         
Cell cell1=new Cell();      
cell1.data.add("element1");         
namelist.add(cell1);
Cell cell2=new Cell();
cell2.data.add("element2");
namelist.add(cell2);
data.put("namelist", namelist);

Cell 类的代码:

public class Cell {
    public ArrayList<String> data;
    public Cell(){
        data=new ArrayList<String>();
    }
}

模板代码:

  <#list namelist as name>
    <#list name.data as element>
      ${element}
    </#list>
  </#list>

但得到如下错误堆栈:

FreeMarker 模板错误:以下已评估为 null 或 失踪: ==> name.data [在模板“report.ftl”中,第 33 行,第 16 列]

---- 提示:这是导致此错误的最后一个点之后的步骤,而不是它之前的步骤。 ---- 提示:如果已知失败的表达式合法地引用了有时为空或缺失的内容,请指定默认值 像 myOptionalVar!myDefault 这样的值,或使用 when-presentwhen-missing。 (这些只有 覆盖表达式的最后一步;覆盖整个表达式,

使用括号:(myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??

---- FTL 堆栈跟踪(“~”表示嵌套相关):

- 失败于:#list name.data 作为元素 [in template "report.ftl" at line 33, column 9]

【问题讨论】:

    标签: java templates freemarker


    【解决方案1】:

    看来您必须为data 创建一个吸气剂。形成docs:

    请注意,公共字段不直接可见;您必须为它们编写一个 getter 方法。

    【讨论】:

    • 或者可以在BeansWrapper 中将exposeFields 设置为true,尽管Java-ish 方式是添加一个getter,所以我也建议这样做。
    • 我选择了 getter 方式:为每个字段添加了 getX 方法,现在它可以工作了!感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    相关资源
    最近更新 更多