You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Ankit Bakshi <an...@ericsson.com> on 2019/05/30 06:57:52 UTC

Null Argument treated as no parameter during method selection

Hi,

I am trying to call Apaches' StringUtils class from my spring XML route file.
I got to with the following code.

<bean id="ExtnFieldServ" class="com.ericsson.tcrm.bil.customizations.util.ExtendedFieldManagerRouteBean" /> <!-just for reference-->

<choice>
                <when>
                    <simple>
                        ${bean:org.apache.commons.lang.StringUtils?method=isNotEmpty(${bean:ExtnFieldServ?method=getFieldValueFromExchange(*,in.header.PA_CONTEXT,PaymentMethod)})}
                    </simple>
<!-stuff happens here-->
</when>
</ choice>

This worked fine when bean:ExtnFieldServ?method=getFieldValueFromExchange returned a non-null value. But failed with null.
Got the following exception

org.apache.camel.component.bean.MethodNotFoundException: Method with name: isNotEmpty() (with no parameters) not found on bean: org.apache.commons.lang.StringUtils@3030debe of type: org.apache.commons.lang.StringUtils. Exchange[Message: com.ericsson.etelcrm.bil.common.exec.SessionContext@1bec93f]

So basically camel was looking for a no parameter method when the actual argument evaluated to null. This is very strange. I don't know if this is normal behavior or a bug.

So I had to think of another way to get the code to work. A couple of workarounds would work. One of which is posted below.

<setProperty propertyName="CC_TMP_PAYMM">
                <simple>
                        ${bean:ExtnFieldServ?method=getFieldValueFromExchange(*,in.header.PA_CONTEXT,PaymentMethod)}
                </simple>
            </setProperty>
            <choice>
                <when>
                    <simple>
                        ${bean:org.apache.commons.lang.StringUtils?method=isNotEmpty(property.CC_TMP_PAYMM)}
                    </simple>
<!-stuff happens here-->
</when>
</ choice>

I went with property, the same approach can be taken with headers. Or I can create wrapper class around StringUtils which will have methods like below, and I would need to declare this wrapper as spring bean or use directly if I can using statics.

public boolean isNotBlank()
    {
        return isNotBlank(null);
    }

    public boolean isEmpty(String value)
    {
        return org.apache.commons.lang.StringUtils.isEmpty(value);
    }

What I really wanna know if why Camel is looking for  a no parameter method when the parameter expression evaluates to null?

Regards,
Ankit Bakshi

Re: Null Argument treated as no parameter during method selection

Posted by Alex Dettinger <al...@gmail.com>.
Hi Ankit,

  I think you have spotted a very specific case. You could help by checking
whether this issue is present in the last camel version.
If it is not fixed there, then building a minimal camel test reproducing
the issue would be the way to go :)

Cheers,
Alex

On Thu, May 30, 2019 at 9:55 AM Ankit Bakshi <an...@ericsson.com>
wrote:

> Hi,
>
> I am trying to call Apaches' StringUtils class from my spring XML route
> file.
> I got to with the following code.
>
> <bean id="ExtnFieldServ"
> class="com.ericsson.tcrm.bil.customizations.util.ExtendedFieldManagerRouteBean"
> /> <!-just for reference-->
>
> <choice>
>                 <when>
>                     <simple>
>
> ${bean:org.apache.commons.lang.StringUtils?method=isNotEmpty(${bean:ExtnFieldServ?method=getFieldValueFromExchange(*,in.header.PA_CONTEXT,PaymentMethod)})}
>                     </simple>
> <!-stuff happens here-->
> </when>
> </ choice>
>
> This worked fine when bean:ExtnFieldServ?method=getFieldValueFromExchange
> returned a non-null value. But failed with null.
> Got the following exception
>
> org.apache.camel.component.bean.MethodNotFoundException: Method with name:
> isNotEmpty() (with no parameters) not found on bean:
> org.apache.commons.lang.StringUtils@3030debe of type:
> org.apache.commons.lang.StringUtils. Exchange[Message:
> com.ericsson.etelcrm.bil.common.exec.SessionContext@1bec93f]
>
> So basically camel was looking for a no parameter method when the actual
> argument evaluated to null. This is very strange. I don't know if this is
> normal behavior or a bug.
>
> So I had to think of another way to get the code to work. A couple of
> workarounds would work. One of which is posted below.
>
> <setProperty propertyName="CC_TMP_PAYMM">
>                 <simple>
>
> ${bean:ExtnFieldServ?method=getFieldValueFromExchange(*,in.header.PA_CONTEXT,PaymentMethod)}
>                 </simple>
>             </setProperty>
>             <choice>
>                 <when>
>                     <simple>
>
> ${bean:org.apache.commons.lang.StringUtils?method=isNotEmpty(property.CC_TMP_PAYMM)}
>                     </simple>
> <!-stuff happens here-->
> </when>
> </ choice>
>
> I went with property, the same approach can be taken with headers. Or I
> can create wrapper class around StringUtils which will have methods like
> below, and I would need to declare this wrapper as spring bean or use
> directly if I can using statics.
>
> public boolean isNotBlank()
>     {
>         return isNotBlank(null);
>     }
>
>     public boolean isEmpty(String value)
>     {
>         return org.apache.commons.lang.StringUtils.isEmpty(value);
>     }
>
> What I really wanna know if why Camel is looking for  a no parameter
> method when the parameter expression evaluates to null?
>
> Regards,
> Ankit Bakshi
>