6

解決

以前、次のような LineItem クラスにアクセサーを追加しようとしました

public String getItemNo() {
    return itemNo;
}

FTL を から${lineItem.itemNo}に変更しまし${lineItem.getItemNo()}たが、うまくいきませんでした。解決策は、FTL を変更せにアクセサーを追加することでした ( .${lineItem.itemNo}

バックグラウンド

Freemarker を使用して一部のメールをフォーマットしています。このメールでは、請求書のように製品情報を何行も記載する必要があります。私の目標は、FTL でそれらを反復処理できるように、(マップ内の) オブジェクトのリストを渡すことです。現在、テンプレート内からオブジェクトのプロパティにアクセスできないという問題が発生しています。私はおそらく何か小さいものを見逃しているだけですが、現時点では困惑しています.

Freemarker を使用した Java クラス

これは、要点をより迅速に理解するために、私のコードをより単純化したバージョンです。LineItemは、単純なコンストラクターを使用して各値を設定するパブリック プロパティ (ここで使用されている名前と一致) を持つパブリック クラスです。また、アクセサーでプライベート変数を使用しようとしましたが、それも機能しませんでした。

他のキーと値のペアにも Map を使用するため、ListオブジェクトのLineItemthisも に格納しています。Map

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);

FTL

<#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>

エラー

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

LineItem.java

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;
    }
}  
4

2 に答える 2

7

このLineItemクラスには、そのすべての属性に対する getter メソッドがありません。そのため、Freemarker はそれらを見つけることができません。の属性ごとに getter メソッドを追加する必要がありますLineItem

于 2013-08-21T07:52:25.147 に答える