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が発生します。誰かがクラスパスからテンプレートを取得する最良の方法を説明できますか?
ありがとう。
これが私のために働いた結果です:
freemarkerConfiguration = new Configuration(Configuration.VERSION_2_3_28);
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "/");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("email/vendor.tpl");
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
にあります。
freemarkerConfiguration = new Configuration();
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("template.tpl");
このメソッドを使用して、クラスが配置されているパッケージからクラスをロードします。
org.foo.SomeClass
テンプレートはクラスパスの/org/foo
で検索されます。これにより、テンプレートを使用/ロードするクラスとともにテンプレートが保存されます。
Struts 2とConventionsプラグインを使用している場合、wunteeのソリューションは機能していないようです:setClassForTemplateLoading
はClassTemplateLoader
のインスタンスを作成し、どのパスに関係なくjar内のファイルを検索しません接頭辞を指定します。
代わりに、StrutsClassTemplateLoader
のインスタンスを作成します。 (これは、FreemarkerManager
メソッドのgetTemplateLoader
のカスタムサブクラスで行います。)パラメーターをとらないため、おそらくStrutsとConventionsがどのように機能するかを知っているだけです。