2013-08-14 11 views
6

Wydaje się całkiem proste zastosowanie metod w szablonach. Próbowałem, ale nie mogłem sprawić, żeby działało. Czy ktoś może mi powiedzieć, co zrobiłem źle?Szablony prędkości, które nie zastępują metod

Dzięki.

To jest mój kod

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

i to jest wyjście:

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

zmiennych podstawienia wydaje się działać prawidłowo, ale nie wywołania metod.

Proszę o pomoc.

Odpowiedz

5

Problemem jest to, że ze względów bezpieczeństwa Velocity tylko umożliwia wywołanie publicznych metod z klas publicznych. Klasa anonimowa nie jest publiczna, więc połączenie jest blokowane.

Będzie działać, jeśli umieścisz prawdziwy obiekt, instancję klasy publicznej.

Będzie również działać, jeśli wyłączysz bezpiecznego uberspektora, ale to nie jest dobry pomysł, ponieważ otwiera system.

+0

Dzięki! To pomogło! Robiłem POC, więc nie zawracałem sobie głowy tworzeniem "prawdziwych" klas ... – Bennie

Powiązane problemy