我的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,即没有导入语句,那么它工作得很好。我做什么好?谢谢。
发布于 2012-10-02 02:46:36
这些模板没有问题,问题在于您使用FreeMarker的Java API的方式。
当#import尝试解析./macros.txt路径时,它会尝试相对于当前模板的路径来解析它,但是由于模板是从Reader加载的,并且您已经传递了null作为模板名称(这与模板路径相同),所以它将遇到NPE的情况。这是一个不恰当的错误消息,但无论如何它都不能解析该路径,因为它不知道当前模板来自哪里(请记住,您只给了FreeMarker一个Reader )。正确的方法是:
Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(new File("/where/you/store/the/templates"));
Template template = cfg.getTemplate("testMacro.txt");现在,FreeMarker将模板的名称设置为testMacro.txt,并且还负责模板的加载和缓存。如果您仍然需要直接从Reader加载模板,您可以这样做:
Template template = new Template("testMacro.txt", new FileReader(...), cfg);请注意非空模板名称。如果这是真实的,这并不重要,但它将用于解析模板中的相对路径。还要注意,因为FreeMarker使用虚拟路径,所以必须在Configuration中正确设置模板加载器。
https://stackoverflow.com/questions/12673005
复制相似问题