2012-05-29 5 views
5

Я изучаю использование FreeMarker для записи файлов EDI. Это, в основном, сильно отформатированные (и проверенные) электронные счета-фактуры. Я решил начать, написав простой пример, и я застрял, получив его в шаблоне «вложенное pojo». Под этим я подразумеваю POJO, который содержит POJO, где у обоих из них есть данные, которые я хочу получить на моем выходе. Я написал единичный тест (самодостаточный), который не работает по неизвестной причине. Когда я запускаю тест, я получаю следующее исключение:Как использовать FreeMarker для шаблона вложенных Pojos?

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

} 

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

ответ

9

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

+0

Спасибо. Я так долго смотрел на это, я убедил себя, что FreeMarker ошибался. Ваш ответ ясен и очень оценен. – Spina

Смежные вопросы