2012-05-31 26 views
5

Spędziłem chwilę próbując zidentyfikować tę "specjalną zmienną" w dokumentacji. Miałem przypadek, w którym chciałem przekazać root haszysz do makra, który na nim działał. Znalazłem odniesienia do Environment.getCurrentEnvironment(), ale działa w Java nie szablony. Jak przekazać główny model danych do makra?Jak uzyskać dostęp do komponentu root w szablonie FreeMarker?

Odpowiedz

5

Poniżej znajduje się test jednostki, który z powodzeniem wykonuje to, co robiłem. Kluczem była zmienna ".data_model".

public class TestFreeMarkerTemplating { 

Configuration cfg = new Configuration(); 
StringTemplateLoader stringLoader = new StringTemplateLoader(); 
{ cfg.setTemplateLoader(stringLoader); 
cfg.setObjectWrapper(new BeansWrapper()); } 

@Test 
public void testTestableMacros() throws TemplateException, IOException{ 
    stringLoader.putTemplate("root", "<#macro user testPojo>Welcome ${testPojo.user}. <@subPojo sub/></#macro><#macro subPojo sub>Sub ${sub.user}!</#macro>"); 
    stringLoader.putTemplate("testPojoTemplate", "<#import \"root\" as w><@w.user .data_model/>"); 
    stringLoader.putTemplate("testSubPojoTemplate", "<#import \"root\" as w><@w.subPojo .data_model/>"); 
    assertTemplateAndBeanYield("root", new TestPojo(), ""); 
    assertTemplateAndBeanYield("testPojoTemplate", new TestPojo(), "Welcome Andy. Sub Bill!"); 
    assertTemplateAndBeanYield("testSubPojoTemplate", new SubPojo(), "Sub Bill!"); 

} 

public void assertTemplateAndBeanYield(String templateName, Object bean, String expectedOutput) throws IOException, TemplateException{ 
    Template temp = cfg.getTemplate(templateName); 
    StringWriter out = new StringWriter(); 
    temp.process(bean, out); 

    assertEquals(expectedOutput, 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; } 
} 
} 
Powiązane problemy