Java 导入freemarker宏

Java 导入freemarker宏,java,import,macros,freemarker,Java,Import,Macros,Freemarker,我的macros.txt文件是 <#macro macro1> Helloworld. </#macro> 但它似乎不起作用 在我使用模板文件的java文件中,我有(在我的MacroWorking.java中) 例外情况是 Exception in thread "main" java.lang.NullPointerException at freemarker.core.LibraryLoad.<init>(LibraryLoad.java:82) at

我的
macros.txt
文件是

<#macro macro1>
Helloworld.
</#macro>
但它似乎不起作用

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

例外情况是

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)
线程“main”java.lang.NullPointerException中的异常 位于freemarker.core.LibraryLoad(LibraryLoad.java:82) 位于freemarker.core.FMParser.Import(FMParser.java:1727) 位于freemarker.core.FMParser.FreemarkerDirective(FMParser.java:2389) 位于freemarker.core.FMParser.Content(FMParser.java:2618) 位于freemarker.core.FMParser.OptionalBlock(FMParser.java:2786) 位于freemarker.core.FMParser.Root(FMParser.java:2958) 在freemarker.template.template.(template.java:149) 在freemarker.template.template.(template.java:172) 位于msjava.hdom.examples.DbQuery.main(MacroWorking.java:24) 上面给出了MacroWorking.java的第24行

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

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

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

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

Template template = cfg.getTemplate("testMacro.txt");
现在FreeMarker将模板的名称设置为
testMacro.txt
,并负责加载和缓存模板。如果您仍然需要直接从
读卡器
加载模板,可以通过以下方式进行:

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

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

您是否尝试检查第24行中的对象是否为
null
?多谢合作伙伴,仍需要对此进行更深入的研究。如“模板加载”文档中所述第章位于freemarker.apache.org/docs/pgui\u config\u templateloading.html。它解释了使用
TemplateLoader
s的不同方法。遗憾的是,它没有提到
StringTemplateLoader
类,当模板源代码以
String
s的形式提供时,该类非常有用,这可能正是您所寻找的。
Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(new File("/where/you/store/the/templates"));

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