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

我正在调查使用FreeMarker编写EDI文件。 这些基本上是格式化(和validation)的电子发票。 我决定开始编写一个简单的例子,并坚持让它模板化’嵌套pojo’。 我的意思是一个包含POJO的POJO,其中两个都有我想要输出的数据。 我写了一个unit testing(自包含),由于未知原因而失败。 当我运行测试时,我得到以下exception:

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)  example.TestFreeMarkerTemplating.testSimpleTemplate(TestFreeMarkerTemplating.java:23)  

我在模板上尝试了很多变化,并没有成功。 这是测试:

 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}"