2012-05-29 18 views
5

Prowadzę śledztwo z wykorzystaniem FreeMarker do pisania plików EDI. Są to zasadniczo mocno sformatowane (i zatwierdzone) faktury elektroniczne. Postanowiłem zacząć od napisania prostego przykładu i utknąłem, aby stworzyć szablon "zagnieżdżonego pojo". Mam tu na myśli POJO, który zawiera POJO, w którym oba mają dane, które chcę w moim wyniku. Napisałem test jednostkowy (samodzielny), który kończy się niepowodzeniem z nieznanego powodu. Po uruchomieniu testu otrzymuję następujący wyjątek:Jak korzystać z FreeMarker do szablonu zagnieżdżonego 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> 

Próbowałem wielu odmian tego szablonu i nie odniosłem sukcesu. To jest 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; } 
} 

} 

Dzięki za pomoc!

Odpowiedz

9

Ustawiono instancję się jako root danych modelu TestPojo, więc user w user.getSub() jest „Andy” String, który nie ma metody getSub. Prawidłowy szablon to "Welcome ${user}. Sub ${getSub().user}". Ale przyjemniej jest pisać jako "Welcome ${user}. Sub ${sub.user}".

+0

Dziękuję. Patrzyłem na to tak długo, że przekonałem się, że FreeMarker był w błędzie. Twoja odpowiedź jest jasna i bardzo doceniana. – Spina

Powiązane problemy