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

标签 java freemarker pojo

我正在研究使用 FreeMarker 编写 EDI 文件。这些基本上是经过严格格式化(和验证)的电子发票。我决定从编写一个简单的示例开始,并坚持将其用于模板“嵌套 pojo”。我的意思是一个包含 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}"

关于java - 如何使用 FreeMarker 模板化嵌套的 Pojos?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10807756/

相关文章:

java - Talend 的 JSON 解析器

javascript - 带有双引号表达式的 js_string

freemarker - freemarker表达式是否可以包含空格

java - 使用 Camel 和 Bindy 检查编码的 Pojo

java - 具有一对多/多对一关系的 POJO 数据 (JDBC)

java - 无法使用 Java 创建带有日历 API 的 HangoutsMeet

java - servlet 生成的文件无法下载

java - 在java中传递-d选项

java - 具有模板引擎速度的延迟加载

java - Jackson 映射器不在 arrayList 中映射类