5

ドキュメントでこの「特殊変数」を特定するのにしばらく時間を費やしました。ルートハッシュを、それを操作するマクロに渡すことができるようにしたい場合がありました。Environment.getCurrentEnvironment() への参照を見つけましたが、それはテンプレートではなく Java で機能します。ルート データ モデルをマクロに渡すにはどうすればよいですか?

4

1 に答える 1

5

以下は、私が求めていたものを正常に実行する単体テストです。キーは「.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; }
}
}
于 2012-05-31T20:36:13.643 に答える