2013-08-14 10 views
6

In der Velocity User's Guide scheint es ziemlich einfach zu Methoden in Vorlagen zu verwenden. Ich habe versucht, aber konnte es nicht funktionieren. Kann mir jemand sagen, was ich falsch gemacht habe?Geschwindigkeit Vorlagen ersetzen keine Methoden

Danke.

Dies ist mein Code

@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()); 
} 

und dies ist die Ausgabe:

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

Variable Ersetzungen scheint gut zu funktionieren, aber nicht Methodenaufrufe.

Bitte helfen.

Antwort

5

Das Problem ist, dass Geschwindigkeit aus Sicherheitsgründen nur öffentliche Methoden von öffentlichen Klassen ermöglicht telefonieren. Eine anonyme Klasse ist nicht öffentlich, daher ist der Anruf blockiert.

Es würde funktionieren, wenn Sie ein reales Objekt, eine Instanz einer öffentlichen Klasse, setzen.

Es würde auch funktionieren, wenn Sie den sicheren Uberspector deaktivieren, aber das ist keine gute Idee, da es das System öffnet.

+0

Danke! Das hat geholfen! Ich machte einen POC, also kümmerte ich mich nicht um "echte" Klassen ... – Bennie

Verwandte Themen