私は比較的シンプルなベロシティテンプレートをレンダリングするためのAPIを公開しているSpring Bootアプリケーションを持っています。テンプレートは#parse
を使用して他のいくつかのテンプレートを組み込み、それ以外の場合はJavaレイヤーから渡されたいくつかの基本変数を書き出します。テンプレートはJARファイル内にあるので、クラスパスからロードされます。私は、オンザフライ要求ごとに作成されます以下の速度エンジンの設定を使用します。テンプレートのApache Velocityはテンプレートとリソースのキャッシングを無効にします
VelocityEngine ve = new VelocityEngine();
ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
ve.setProperty("classpath.resource.loader.cache", "false");
ve.setProperty("velocity.engine.resource.manager.cache.enabled", "false");
ve.setProperty("resource.manager.cache.enabled", "false");
ve.init();
複数の部品が要求ごとの一意であることを意味している(リソースがシンプルな春への応答として使用されていますMVCコントローラ)ので、テンプレートリソースのキャッシュを無効にする必要があります。私は上記の構成をそのまま試してみただけでなく、velocity.properties
ファイルのに定義していますが、アプリケーションを再起動するまで、テンプレートやファイルを変更しても効果がありません。
何をしているのかはわかりません(実際には、上記のことが分かります)。
上記のエンジンコードはSpring Component
クラスの中にあり、VelocityEngine
のものを静的な最終フィールドに移動し、毎回ベロシティコンテキストを初期化するだけでは役に立ちません。
毎回、テンプレートを読み込むためにSpring/Velocityにリソースを含めるにはどうすればいいですか?
'VelocityEngine'インスタンスはスレッドセーフですか?静的な参照は機能しますか? –
はい、Velocityはスレッドセーフです。しかし、上記の小さな例とは異なり、VelocityContextは再インスタンス化されていないため、再インスタンス化する必要があります。 –
はい、私は今、 'VelocityEngine'インスタンスへの' static final'リファレンスを保持し、テンプレートをマージするメソッドに 'VelocityContext'を作成しています。すぐにテストして受け入れます。ありがとうございました! –