1

我的macros.txt文件是

<#macro macro1>
Helloworld.
</#macro>

我有另一个文件testMacro.txt。我想在文件中使用这个宏testMacro.txt。我试过以下

<#import "./macros.txt" as my>
<@my.macro1 />

但它似乎不起作用。

在我使用模板文件的 java 文件中,我有(在我的 MacroWorking.java 中)

template = new Template(null,new FileReader("testMacro.txt"),new configuration());

例外是。

Exception in thread "main" java.lang.NullPointerException
at freemarker.core.LibraryLoad.<init>(LibraryLoad.java:82)
at freemarker.core.FMParser.Import(FMParser.java:1727)
at freemarker.core.FMParser.FreemarkerDirective(FMParser.java:2389)
at freemarker.core.FMParser.Content(FMParser.java:2618)
at freemarker.core.FMParser.OptionalBlock(FMParser.java:2786)
at freemarker.core.FMParser.Root(FMParser.java:2958)
at freemarker.template.Template.<init>(Template.java:149)
at freemarker.template.Template.<init>(Template.java:172)
at msjava.hdom.examples.DbQuery.main(MacroWorking.java:24)

MacroWorking.java 的第 24 行是上面给出的。

编辑:使用相同的代码,但我testMacro.txt只有文本HELLOWORLD,即没有导入语句,那么它工作正常。我该怎么办?谢谢。

4

1 回答 1

2

这些模板没有问题,问题在于您使用 FreeMarker 的 Java API 的方式。

#import尝试解析./macros.txt路径时,它会尝试相对于当前模板的路径来解析它,但是由于模板是从 a 加载的Reader并且您已null作为模板名称传递(与模板路径相同),因此它将遇到NPE 情况。这是一条不正确的错误消息,但它无论如何都无法解析该路径,因为它不知道当前模板来自何处(请记住,您只Reader向 FreeMarker 提供了一个)。正确的方法是:

Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(new File("/where/you/store/the/templates"));

Template template = cfg.getTemplate("testMacro.txt");

现在 FreeMarker 将模板的名称设置为testMacro.txt并且还负责加载和缓存它。如果您仍然需要直接从 a 加载模板Reader,您可以这样做:

Template template = new Template("testMacro.txt", new FileReader(...), cfg);

请注意非空模板名称。这是否真实并不重要,但它将用于解析该模板中的相对路径。另请注意,必须在 中正确设置模板加载器Configuration,因为 FreeMarker 使用虚拟路径。

于 2012-10-01T18:46:35.947 回答