簡體   English   中英

如何使用FreeMarker模板化嵌套的Pojos?

[英]How to use FreeMarker to template nested Pojos?

我正在調查使用FreeMarker編寫EDI文件。 這些基本上是格式化(和驗證)的電子發票。 我決定開始編寫一個簡單的例子,並且很難讓它模板化'嵌套的pojo'。 我的意思是一個包含POJO的POJO,其中兩個都有我想要輸出的數據。 我寫了一個單元測試(自包含),由於未知原因而失敗。 當我運行測試時,我得到以下異常:

Expression user.getSub is undefined on line 1, column 24 in simple.
The problematic instruction:
----------
==> ${user.getSub().user} [on line 1, column 22 in simple]
----------

Java backtrace for programmers:
----------
freemarker.core.InvalidReferenceException: Expression user.getSub is undefined on line 1, column 24 in simple.
    at freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:124)
    at freemarker.core.TemplateObject.invalidTypeException(TemplateObject.java:134)
    <snip>
    example.TestFreeMarkerTemplating.testSimpleTemplate(TestFreeMarkerTemplating.java:23)
    <snip>

我在模板上嘗試了很多變化,並沒有取得成功。 這是測試:

package example;

import java.io.*;
import org.junit.Test;
import freemarker.cache.StringTemplateLoader;
import freemarker.ext.beans.BeansWrapper;
import freemarker.template.*;

import static org.junit.Assert.*;

public class TestFreeMarkerTemplating {

Configuration cfg = new Configuration();
StringTemplateLoader stringLoader = new StringTemplateLoader();
{ cfg.setTemplateLoader(stringLoader);
cfg.setObjectWrapper(new BeansWrapper()); }

@Test
public void testSimpleTemplate() throws TemplateException, IOException{
    stringLoader.putTemplate("simple", "Welcome ${user}. Sub ${user.getSub().user}");
    Template temp = cfg.getTemplate("simple");
    StringWriter out = new StringWriter();
    temp.process(new TestPojo(), out);

    assertEquals("Welcome Andy. Sub Bill", out.toString());
}

public static class TestPojo {
    private final String user = "Andy";
    private final SubPojo sub = new SubPojo();

    public String getUser() { return user; }
    public SubPojo getSub() { return sub; }
}

public static class SubPojo {
    private final String user = "Bill";

    public String getUser() { return user; }
}

 }

謝謝你的幫助!

您已將TestPojo實例本身設置為數據模型根,因此user.getSub()userString “Andy”,它沒有getSub方法。 正確的模板是"Welcome ${user}. Sub ${getSub().user}" 但寫作"Welcome ${user}. Sub ${sub.user}"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM