2016-06-21 16 views
0

私は比較的シンプルなベロシティテンプレートをレンダリングするための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にリソースを含めるにはどうすればいいですか?

答えて

0

私はIntelliJでテンプレートやリソースを一度変更してコンパイルする必要がありました。 Ctrl + F9を使用します。しかし、@Claude Brissonにも助けてくれてありがとう。

1

classpath.resource.loader.cache構成キーが必要です。 Velocityでのキャッシングはすべてデフォルトでfalseになるので、あなたはそれを必要としません。

また、リクエストごとにVelocityEngineを再初期化する必要はありません。

私はその変更時に正しく再読み込みリソース以下の小さなテストプログラムでチェック

:それぞれのリクエストであなたがあれば再初期化速度を、それはあなたのケースで動作しない場合

import java.io.PrintWriter; 
import java.io.Writer; 
import java.util.Scanner; 
import org.apache.velocity.VelocityContext; 
import org.apache.velocity.app.VelocityEngine; 
import org.apache.velocity.runtime.RuntimeConstants; 
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;  

public class Test 
{ 
    public static void main(String args[]) 
    { 
     try 
     { 
      VelocityEngine ve = new VelocityEngine(); 
      ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath"); 
      ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName()); 
      // next line not needed since 'false' is the default 
      // ve.setProperty("classpath.resource.loader.cache", "false"); 
      ve.init(); 

      VelocityContext context = new VelocityContext(); 
      Writer writer = new PrintWriter(System.out); 
      Scanner scan = new Scanner(System.in); 
      while (true) 
      { 
       System.out.print("> "); 
       String str = scan.next(); 
       context.put("foo", str); 
       ve.mergeTemplate("test.vm", "UTF-8", context, writer); 
       writer.flush(); 
      } 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

、および特に 、それは確かにSpring自身のClassLoaderキャッシングの問題です。

キャッシングを無効にする方法については、Spring Hot Swapping guideをチェックする必要があります。私は、Springの知識が豊富な誰かが、この特定のケースでどのように進むべきかについてのヒントを与えることができると思います。

+0

'VelocityEngine'インスタンスはスレッドセーフですか?静的な参照は機能しますか? –

+0

はい、Velocityはスレッドセーフです。しかし、上記の小さな例とは異なり、VelocityContextは再インスタンス化されていないため、再インスタンス化する必要があります。 –

+0

はい、私は今、 'VelocityEngine'インスタンスへの' static final'リファレンスを保持し、テンプレートをマージするメソッドに 'VelocityContext'を作成しています。すぐにテストして受け入れます。ありがとうございました! –

関連する問題