web-dev-qa-db-ja.com

クラスパスからのフリーマーカーテンプレートの設定

Freemarkerテンプレートを手動で取得する必要があるWebアプリケーションがあります。テンプレートはライブラリプロジェクトのクラスを介して取得されますが、実際のtplファイルはWebアプリケーションのクラスパスに含まれています。つまり、「taac-backend-api」と「taac-web」という2つのプロジェクトがあります。 taac-backend-apiにはテンプレートを取得して処理するためのコードがありますが、taac-webはテンプレートが格納されている場所です(具体的にはWEB-INF/classes/email/vendor.tplにあります)。 Freepathers setClassForTemplateLoadingメソッドを使用するようにクラスパスリソースをスプリングします。私はこれがうまくいくと思います:

    freemarkerConfiguration = new Configuration();
    freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "");
    Template freemarkerTemplate = freemarkerConfiguration.getTemplate("/email/vendor.tpl");

それでも、常にFileNotFoundExceptionが発生します。誰かがクラスパスからテンプレートを取得する最良の方法を説明できますか?

ありがとう。

35
wuntee

これが私のために働いた結果です:

freemarkerConfiguration = new Configuration(Configuration.VERSION_2_3_28);
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "/");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("email/vendor.tpl");
80
wuntee

2017年には、以下が非推奨になりました。

Configuration conf = new Configuration();

freemarker.template.Versionをコンストラクタに渡す必要があります。

Configuration conf = new Configuration(new Version(2, 3, 23));
conf.setClassForTemplateLoading(Application.class, "/views");

ここで、バージョン番号はFreeMarkerの現在のバージョンを指します。

viewsディレクトリはsrc/main/resourcesにあります。

7
Jan Bodnar
freemarkerConfiguration = new Configuration();
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("template.tpl");

このメソッドを使用して、クラスが配置されているパッケージからクラスをロードします。

org.foo.SomeClassテンプレートはクラスパスの/org/fooで検索されます。これにより、テンプレートを使用/ロードするクラスとともにテンプレートが保存されます。

4
user738048

Struts 2とConventionsプラグインを使用している場合、wunteeのソリューションは機能していないようです:setClassForTemplateLoadingClassTemplateLoaderのインスタンスを作成し、どのパスに関係なくjar内のファイルを検索しません接頭辞を指定します。

代わりに、StrutsClassTemplateLoaderのインスタンスを作成します。 (これは、FreemarkerManagerメソッドのgetTemplateLoaderのカスタムサブクラスで行います。)パラメーターをとらないため、おそらくStrutsとConventionsがどのように機能するかを知っているだけです。

0
Rodney Gitzel