Speed ​​patterns do not replace methods

The Velocity User Guide seems pretty straightforward to use methods in templates. I tried, but could not get it to work. Can someone tell me what I did wrong?

Thanks.

This is my 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()); } 

and this is the result:

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

Substitution variables seem to work fine, but not method calls.

Please, help.

+6
source share
1 answer

The problem is that, for security reasons, Velocity allows you to call public methods on public classes. . An anonymous class is not public, so the call is blocked.

This will work if you place a real object, an instance of an open class.

This will also work if you disable the protected uberspector, but this is not a good idea, as it opens the system.

+5
source

Source: https://habr.com/ru/post/951728/


All Articles