2013-08-14 2 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 только позволяет вызывать публичные методы из общественных классов. Анонимный класс не является общедоступным, поэтому вызов блокируется.

Это сработает, если вы поместите реальный объект, экземпляр публичного класса.

Это также сработает, если вы отключите защищенный uberspector, но это не очень хорошая идея, так как он открывает систему.

+0

Спасибо! Это помогло! Я делал POC, поэтому я не беспокоился о создании «реальных» классов ... – Bennie

Смежные вопросы