You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@velocity.apache.org by "Henning Schmiedehausen (JIRA)" <de...@velocity.apache.org> on 2007/03/08 01:04:42 UTC

[jira] Closed: (VELOCITY-389) IllegalArgumentException while calling an overloaded method

     [ https://issues.apache.org/jira/browse/VELOCITY-389?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Henning Schmiedehausen closed VELOCITY-389.
-------------------------------------------


> IllegalArgumentException while calling an overloaded method
> -----------------------------------------------------------
>
>                 Key: VELOCITY-389
>                 URL: https://issues.apache.org/jira/browse/VELOCITY-389
>             Project: Velocity
>          Issue Type: Bug
>          Components: Engine
>    Affects Versions: 1.4
>         Environment: Operating System: All
> Platform: All
>            Reporter: mike
>             Fix For: 1.5
>
>
> If there are two methods with the same name and different parameters like:
> public class myClass
> {
>     public String foo ( Integer intObj );
>     public String foo ( String str );
> }
> and a velocity template like this
> $myObj.foo( $someObj.getNull() )
> $myObj.foo( $str )
> while $someObj.getNull() returns null and $str is a java.lang.String object
> with a String like 'test'. Because velocity caches the first method with the 
> Integer argument on calling with the parameter null (which isn't of course of 
> any type/class) the call fails with the String argument, because velocity tries
> to call the foo( Integer intObj )!
> In the velocity log appears a IllegalArgumentException which is right, but 
> velocity should call the right method!
> the bug appears only, if the call of foo is in a file
> which is included by #parse. 
> You can reproduce the bug with following files:
> main template file:
> #set ( $param = $someobj.getNull() )
> #parse ( "includecall.vm" )<br>
> #set ( $param = "a string" )
> #parse ( "includecall.vm" )
> includecall.vm:
> $testobj.foo( $param )
> class with the name someobj in the context:
> public class VelocityCachingBug
> {
>     public VelocityCachingBug()
>     {
>     }
>     public String foo ( Integer s )
>     {
>         return "Integer";
>     }
>     public String foo ( String i )
>     {
>         return "String";
>     }
>     public Object getNull()
>     {
>         return null;
>     }
> }
> if you render the main template, the second call can't be found by velocity
> because the parsed file is cached only once (as one single node). 
> I don't think the solution to this is to cache every call in a parsed file (if
> it's parsed more than once), because that can lead to much more memory use if
> you have many parsed files (like we have...), which are mostly the same.
> mike

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@velocity.apache.org
For additional commands, e-mail: dev-help@velocity.apache.org