> On 10/12/2017, at 4:24 PM, Nitkalya Wiriyanuparb (Ing) <[email protected]>
> wrote:
>
> On 9 Dec 2017, 3:35 AM +1300, Mark Thomas <[email protected]>, wrote:
>
>> On 07/12/17 15:00, Mark Thomas wrote:
>>> On 07/12/17 02:52, Nitkalya (Ing) Wiriyanuparb wrote:
>>>> Hello.
>>>>
>>>> I'm upgrading from Tomcat 7.0.30 to 8.5.24. Everything is working fine, but
>>>> I notice that BeanELResolver behaves differently when calling a bean
>>>> varargs method with no argument.
>>>>
>>>> My action bean has a method with the signature "public String
>>>> getIncludes(final String... moduleNames)". I'm calling it on one of my JSP
>>>> pages like "${actionBean.getIncludes()}", but got MethodNotFoundException.
>>>> Calling it with some arguments or an empty array would work – as one would
>>>> expect. Please see the stacktrace below.
>>>>
>>>> This method call used to be okay in 7.0.30. I've tried to find something in
>>>> the EL and JSP specifications around varargs, but couldn't find anything
>>>> concrete. I got the impression that it's not officially supported in the
>>>> specs, but Tomcat supports it.
>>>>
>>>> I'm treating it as a bug as I've already created a patch for it – see
>>>> below. However, I'm new to this mailing list so I thought I would ask
>>>> first.
>>>>
>>>> Is this a bug?
>>>
>>> It looks like it, yes.
>>>
>>> Thanks for the patch. Note it is usually best to attach patches to a
>>> Bugzilla issue as that prevents them from getting mangled by e-mail clients.
>>>
>>> I'll take a closer look at this now.
>>
>> Thanks again for reporting the issue and providing a patch.
>>
>> I've applied your patch with a few changes and additions.
>>
>> The provided test cases highlighted the complexity of matching varargs
>> methods, particularly because of the coercion rules that apply in EL. I
>> expanded the tests significantly to try and cover all the edge cases. I
>> extended the proposed patch to cover those edge cases as well.
>>
>> The changes will are in:
>> - trunk for 9.0.3 onwards
>> - 8.5.x for 8.5.25 onwards
>> - 8.0.x for 8.0.49 onwards
>>
>> Mark
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>>
>
> Thanks for the quick fix. I’ll be testing it with my system tomorrow.
>
> I think there might be another edge case that we missed i.e. passing an array
> as a varargs. If I remember correctly the array is currently coerced into a
> string. Its string representation becomes the first element of the varargs
> instead of the array being the varargs itself. I could be wrong though – will
> double check tomorrow and report back again. However, I have no use case for
> this edge case if it’s deemed ‘unsupported’.
>
> Cheers,
> Ing
Tested with my system – everything’s awesome. I can also confirm that the edge
case I mentioned is valid; calling the varargs method with an array
${actionBean.getIncludes([“something"])} doesn’t coerce correctly. I personally
don’t care about this use case, so I’ll leave it to the maintainers to decide.
:)
Cheers
Ing