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のJavaAPIの使用方法にあります。

#importパスを解決しようとする./macros.txtと、現在のテンプレートのパスを基準にして解決しようとしますが、テンプレートがから読み込まれ、テンプレート名(テンプレートパスと同じ)としてReader渡されたため、次のようになります。 nullNPEの状況。これは不適切なエラーメッセージですが、現在のテンプレートがどこから来たのかわからないため、とにかくそのパスを解決できませんでした(ReaderFreeMarkerにのみを与えたことを思い出してください)。適切な方法は次のとおりです。

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);

null以外のテンプレート名に注意してください。それが本物であるかどうかは重要ではありませんが、そのテンプレートの相対パスを解決するために使用されます。ConfigurationFreeMarkerは仮想パスで動作するため、テンプレートローダーをで正しく設定する必要があることにも注意してください。

于 2012-10-01T18:46:35.947 に答える