在< #list>中访问对象的属性

时间:2013-08-20 07:23:51

标签: java freemarker

解决方案

我之前曾尝试过将访问器添加到LineItem类,如

public String getItemNo() {
    return itemNo;
}

并将FTL从${lineItem.itemNo}更改为${lineItem.getItemNo()},但这不起作用。 解决方案是添加访问者,但更改FTL(将其保留为${lineItem.itemNo}

背景

我正在使用Freemarker格式化一些电子邮件。在这封电子邮件中,我需要在发票上列出一系列产品信息。我的目标是传递一个对象列表(在一个Map中),以便我可以在FTL中迭代它们。目前我遇到一个问题,我无法从模板中访问对象属性。我可能只是错过了一些小事,但此刻我很难过。

使用Freemarker的Java类

这是我的代码的更简化版本,以便更快地获得重点。 LineItem是一个具有公共属性的公共类(与此处使用的名称相匹配),使用简单的构造函数来设置每个值。我也尝试过使用带有访问器的私有变量但是也没有用。

我还将List LineItemMap个对象存储在Map<String, Object> data = new HashMap<String, Object>(); List<LineItem> lineItems = new ArrayList<LineItem>(); String itemNo = "143"; String quantity = "5"; String option = "Dried"; String unitPrice = "12.95"; String shipping = "0.00"; String tax = "GST"; String totalPrice = "64.75"; lineItems.add(new LineItem(itemNo, quantity, option, unitPrice, shipping, tax, totalPrice)); data.put("lineItems", lineItems); Writer out = new StringWriter(); template.process(data, out); 中,因为我还将Map用于其他键/值对。

<#list lineItems as lineItem>                                   
    <tr>
        <td>${lineItem.itemNo}</td>
        <td>${lineItem.quantity}</td>
        <td>${lineItem.type}</td>
        <td>${lineItem.price}</td>
        <td>${lineItem.shipping}</td>
        <td>${lineItem.gst}</td>
        <td>${lineItem.totalPrice}</td>
   </tr>
</#list>

FTL

FreeMarker template error:
The following has evaluated to null or missing:
==> lineItem.itemNo  [in template "template.ftl" at line 88, column 95]

错误

public class LineItem {
    String itemNo;
    String quantity;
    String type;
    String price;
    String shipping;
    String gst;
    String totalPrice;

    public LineItem(String itemNo, String quantity, String type, String price,
                    String shipping, String gst, String totalPrice) {
        this.itemNo = itemNo;
        this.quantity = quantity;
        this.type = type;
        this.price = price;
        this.shipping = shipping;
        this.gst = gst;
        this.totalPrice = totalPrice;
    }
}  

LineItem.java

{{1}}

2 个答案:

答案 0 :(得分:4)

LineItem类缺少其所有属性的getter方法。因此,Freemarker无法找到它们。您应该为LineItem的每个属性添加一个getter方法。

答案 1 :(得分:0)

对我来说,在模型中添加@CompileStatic可以达到目的。