2013-08-14 4 views
6

Velocity User's Guideでは、テンプレートでメソッドを使用するのはかなり簡単です。 私は試しましたが、動作させることができませんでした。誰かが私が間違ったことを教えてもらえますか?ベロシティテンプレートはメソッドを代用しません

ありがとうございました。

は、これは私のコード

@Test 
public void testVelocity() { 
    Velocity.init(); 
    VelocityContext map = new VelocityContext(); 
    map.put("test", "Success"); 
    map.put("ok", "OK!"); 
    map.put("func", new Object() {public String test() {return "Yay!";}}); 
    map.put("func2", new Object() {public String test(String t) {return t+t;}}); 

    String template = "${func.test()} $test $func2.test($ok)"; 
    StringWriter writer = new StringWriter(); 
    Velocity.evaluate(map, writer, "", new StringReader(template)); 
    assertEquals("Yay! Success OK!OK!", writer.toString()); 
} 

であり、これが出力されます。

org.junit.ComparisonFailure: 
Expected :Yay! Success OK!OK! 
Actual :${func.test()} Success $func2.test($ok) 

変数置換が正常に動作するようだが、いないメソッド呼び出し。

助けてください。

答えて

5

セキュリティ上の理由から、Velocityは呼び出しを許可するのは公開方法公開クラスです。匿名クラスはpublicではないため、呼び出しはブロックされます。

パブリッククラスのインスタンスである実オブジェクトを置くとうまくいくでしょう。

セキュアなuberspectorを無効にしても機能しますが、それはシステムを開くので良い考えではありません。

+0

ありがとうございます!それが助けになった!私はPOCをやっていたので、本当のクラスを作ることに気を使わなかった... – Bennie