Velocity模板不能替代方法

时间:2013-08-14 14:01:35

标签: velocity

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)

变量替换似乎工作正常,但不是方法调用。

请帮忙。

1 个答案:

答案 0 :(得分:5)

问题是出于安全原因,Velocity只允许调用公共类公共方法。匿名类不公开,因此呼叫被阻止。

如果您放置一个真实对象,一个公共类的实例,它将起作用。

如果您禁用安全的uberspector,它也会有效,但这不是一个好主意,因为它会打开系统。