2012-01-02 22 views
12

私は、Spring WebアプリケーションでVelocity経由でテンプレートから電子メールを作成します。今私はいくつかの値のHTMLエスケープする必要があります。 Velocity Escape Toolが見つかりました。しかし、私は設定が機能していない。SpringプロパティでVelocity Escape Toolを設定するには?

<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean"> 
    <property name="resourceLoaderPath" value="classpath:/velocity/emailTemplates" /> 
    <property name="preferFileSystemAccess" value="false" /> 
    <property name="overrideLogging" value="true" /> 
    <property name="velocityProperties"> 
     <util:properties> 
      <prop key="input.encoding">UTF-8</prop> 
      <prop key="output.encoding">UTF-8</prop> 
      <prop key="tools.toolbox">application</prop> 
      <prop key="tools.application.esc">org.apache.velocity.tools.generic.EscapeTool</prop> 
     </util:properties> 
    </property> 
</bean> 

テンプレート(htmlEscapeTest.vm):

with escape: $esc.html($needEscape) 

のTestCase:

@Test 
public void testHtmlEscapingSupport() { 

    final String needEscape = "<test>"; 

    ModelMap model = new ModelMap(); 
    model.addAttribute("needEscape", needEscape); 
    String result = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, HTML_ESCAPING_TEMPLATE_FILE, model); 
    assertThat(result, StringContains.containsString("&lt;test&gt;")); 
} 

しかし、私がしようと試みている何

ので運賃は(春のapplicationContext.xmlを)ですテストに失敗しました。...got: "with escape: $esc.html($needEscape)"

誰かが私に間違っていることをヒントを与えることができますか?


は、私がテストでnew EscapeTool() expliciteを追加する場合:

VelocityContext velocityContext = new VelocityContext(model); 
velocityContext.put("esc", new EscapeTool()); 
StringWriter writer = new StringWriter(); 
velocityEngine.mergeTemplate(HTML_ESCAPING_TEMPLATE_FILE, velocityContext, writer); 
String result = writer.toString(); 

は、それが働いています。しかし、ドキュメントを理解する限り、ツールはプロパティファイルで一度設定する必要があります。

私はVelocity Engine 1.7とVelocity Tools 2.0を使用しています。

+1

は、一般的に、あなたが速度を呼び出したいというのが私の経験をされています手動でコンテキストを設定する必要があります。問題のドキュメントへのリンクを提供しますか? – jtoberon

+0

@jtoberon:http://velocity.apache.org/tools/devel/config.properties.htmlとhttp://velocity.apache.org/tools/devel/config.html – Ralph

+0

どのバージョンのVelocityを使用していますか?元のエスケープツールのリンクは1.4、リンクは2.0になっています。 – jtoberon

答えて

3

警告:私は少し前から幾分漠然とした思い出に基づいています。マイルは異なる場合があります。

「Velocity」ドキュメントの一部は、「VelocityViewでこれを使用するにはどうすればよいですか?」という観点から読んでください。 Javaコードから直接同じ機能を使用する場合は、いくつかの詳細を変更する必要があります。この場合は、Contextを正しく作成していないと思います。あなたは「あなたのためのコンテキストを作成するには、[ToolManager]を頼む」ことを確認し、the standalone example hereに従うことを試してみてください:あなたはVelocityViewを使用する場合は、おそらくあなたのためのカバーの下に行われている同様の

ToolManager manager = ... 
Context context = manager.createContext(); 

何かを。

+0

ありがとう、私はそれを試してみます。 – Ralph

+0

@jtoberon私は同様の問題に遭遇しました。私の理解では、「VelocityEngineFactoryBean」がこれを処理していましたが、どれくらいの量があるのか​​は分かりません。 – Dan

+0

ええと、特に春には理にかなっていて、彼は春を使っていると言いました。それでも彼の例はうまくいかない。これを理解するには、 'VelocityEngineUtils'が実行されているときにコンテキスト内の内容を正確にチェックするためにデバッガで失敗したテストを実行する必要があります。 – jtoberon

1

ここで私はちょうど働いているいくつかのコードです。標準ツールがToolManagerによって自動的に設定されていることがわかりました。

@Autowired 
private VelocityEngine velocityEngine; 

public void createHtml(String templateLocation, Map<String, Object> model) throws Exception { 
    ToolManager toolManager = new ToolManager(); 
    ToolContext toolContext = toolManager.createContext(); 
    VelocityContext velocityContext = new VelocityContext(model, toolContext); 
    StringWriter resultWriter = new StringWriter(); 
    velocityEngine.mergeTemplate(templateLocation, "UTF-8", velocityContext, resultWriter); 
    String html = resultWriter.toString(); 
    // use the HTML here 
} 

そして、私のテンプレートあなたはVelocityEngineで直接ツールを設定することはできません。この

<p>Dear $esc.html($customer.firstname)</p> 
5

を持っています。あなたの代わりに何、あなたがモデルマップ内の任意のツールを渡すVelocityEngineUtilsを使用する場合ということです:

ModelMap model = new ModelMap(); 
model.put("esc", new EscapeTool()); 
VelocityEngineUtils.mergeTemplateIntoString(
       velocityEngine, "template.vm", "UTF-8", model) 

それともVelocityEngineを使用する場合は、直接あなたができる:

VelocityContext velocityContext = new VelocityContext(model); 
velocityEngine.mergeTemplate(templateLocation, encoding, velocityContext, writer); 
0
  1. 追加速度ツールはpomに依存するか、クラスパスにjarを追加します。
  2. 速度コンテキストでエスケープツールオブジェクトを追加します。

    [context.put( "escapeTool"、新EscapeTool())]テンプレートで

  3. 使用escapeTool

  4. [$ escapeTool.xml(value_to_be_escaped)]

0

この変更:へ

<property name="velocityProperties"> 
    <util:properties> 
     <prop key="input.encoding">UTF-8</prop> 
     <prop key="output.encoding">UTF-8</prop> 
     <prop key="tools.toolbox">application</prop> 
     <prop key="tools.application.esc">org.apache.velocity.tools.generic.EscapeTool</prop> 
    </util:properties> 
</property> 

<property name="velocityProperties"> 
      <value> 
       input.encoding=UTF-8 
       output.encoding=UTF-8 
       tools.toolbox=application 
       tools.application.esc=org.apache.velocity.tools.generic.EscapeTool 
      </value> 
     </property> 
関連する問題