Details
-
Bug
-
Status: Resolved
-
Blocker
-
Resolution: Fixed
-
2.2
Description
Requirement:
A binding $var containing an object which class (org.xwiki.MyClass) implementing a String getName() method.
The following code:
$var.class.getName() $var.getName()
fail with:
Caused by: org.apache.velocity.exception.MethodInvocationException: Invocation of method 'getName' in class org.xwiki.MyClass threw exception java.lang.IllegalArgumentException: object is not an instance of declaring class at mytemplaye[line 1, column 26] at org.apache.velocity.runtime.parser.node.ASTMethod.handleInvocationException(ASTMethod.java:306) at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:239) at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:369) at org.apache.velocity.runtime.parser.node.ASTReference.render(ASTReference.java:490) at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:423) at org.apache.velocity.Template.merge(Template.java:358) at org.apache.velocity.Template.merge(Template.java:262) at org.xwiki.velocity.internal.DefaultVelocityEngine.evaluate(DefaultVelocityEngine.java:271) ... 69 more Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.doInvoke(UberspectImpl.java:565) at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:548) at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:219) ... 75 more
The reason is that ClassUtils.getMethod cache does not make any difference between an instance of Class<org.xwiki.MyClass> and and instance of org.xwiki.MyClass so when ASTMethod#execute ask for the second getName() it end up with Class#getName() instead of MyClass#getName().
Was working fine in 1.7.