2012-05-31 8 views
5

Ich habe eine Weile damit verbracht, diese "spezielle Variable" in der Dokumentation zu identifizieren. Ich hatte einen Fall, in dem ich in der Lage sein wollte, den Root-Hash an ein Makro zu übergeben, das damit arbeiten würde. Ich habe Verweise auf Environment.getCurrentEnvironment() gefunden, aber das funktioniert in Java, nicht in Templates. Wie übergibt man das Stammdatenmodell an ein Makro?Wie kann ich auf die Root-Bean in meiner FreeMarker-Vorlage zugreifen?

Antwort

5

Unten ist ein Komponententest, der erfolgreich macht, was ich suchte. Der Schlüssel war die Variable '.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; } 
} 
} 
Verwandte Themen