如何使用FreeMarker模板化嵌套的Pojos? [英] How to use FreeMarker to template nested Pojos?

查看:182
本文介绍了如何使用FreeMarker模板化嵌套的Pojos?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm investigating using FreeMarker to write EDI files. These are basically heavily formatted (and validated) electronic invoices. I decided to get started by writing a simple example and am stuck getting it to template a 'nested pojo'. By this I mean a POJO which contains POJOs where both of these have data I want in my output. I wrote a unit test (self contained) that is failing for an unknown reason. When I run the test I get the following 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)
    <snip>
    example.TestFreeMarkerTemplating.testSimpleTemplate(TestFreeMarkerTemplating.java:23)
    <snip>

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

I've tried many variations on the template, and haven't met success. This is the test:

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()中的用户 String Andy,它没有 getSub 方法。正确的模板是欢迎$ {user} .Sub $ {getSub()。user}。但写作欢迎$ {user} .Sub $ {sub.user}

You have set the TestPojo instance itself as the data-model root, so the user in user.getSub() is the String "Andy", which doesn't have a getSub method. The correct template is "Welcome ${user}. Sub ${getSub().user}". But it's nicer to write as "Welcome ${user}. Sub ${sub.user}".

这篇关于如何使用FreeMarker模板化嵌套的Pojos?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆