2013-08-14 11 views
6

Nel numero Velocity User's Guide sembra piuttosto semplice utilizzare i metodi nei modelli. Ho provato, ma non riuscivo a farlo funzionare. Qualcuno può dirmi cosa ho fatto di sbagliato?I modelli di velocità non sostituiscono i metodi

Grazie.

Questo è il mio codice

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

e questo è l'output:

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

sostituzioni variabili sembra funzionare bene, ma non chiamate di metodo.

Per favore aiuto.

risposta

5

Il problema è che per motivi di sicurezza Velocity solo consente di chiamare metodi pubblici di classi pubbliche. Una classe anonima non è pubblica, quindi la chiamata è bloccata.

Funzionerebbe se si inserisce un oggetto reale, un'istanza di una classe pubblica.

Funzionerebbe anche se si disabilita l'uberspector sicuro, ma non è una buona idea, dal momento che apre il sistema.

+0

Grazie! Questo ha aiutato! Stavo facendo un POC quindi non mi sono preoccupato di creare classi "reali" ... – Bennie

Problemi correlati