Как использовать FreeMarker для шаблона вложенных 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; }
}

 }

Спасибо за любую помощь!

Ответы на вопрос(1)

Решение Вопроса

TestPojo Сам экземпляр как корень модели данных, поэтомуuser вuser.getSub() этоString "Andy", который не имеетgetSub метод. Правильный шаблон"Welcome ${user}. Sub ${getSub().user}", Но лучше написать как"Welcome ${user}. Sub ${sub.user}".

 Spina30 мая 2012 г., 03:29
Спасибо. Я так долго смотрел на это, что убедил себя, что FreeMarker был неправ. Ваш ответ ясен и высоко ценится.

Ваш ответ на вопрос