Hi Claus,
thanks again,
yes I understand the problem, and I agree that the Simple language should
be simple !
While for my specific case, I've found that it exists an "is" operator in
simple language to test instanceof :
${in.header.type} is 'java.lang.String'
I can use it to check if the body is an instance of BeanInvocation, then
use the ?. operator, else route the message somewhere else.
For example I can change the original XML route in this way (it is a bit
verbose but I hope it should work):
<camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring
">
<proxy id="myServiceProxy" serviceInterface="org.example.MyService"
serviceUrl="direct:step1" />
<route>
<from uri="direct:step1" />
<choice>
<when>
<simple>${body} is 'org.apache.camel.component.bean.BeanInvocation'</simple>
<to uri="direct:step2" />
</when>
<otherwise>
<throwException ref="unsupportedException" />
</otherwise>
</choice>
</route>
<route>
<from uri="direct:step2" />
<setHeader headerName="methodName">
<simple>${body?.method?.name}</simple>
</setHeader>
<choice>
<when>
<simple>${header.methodName} == 'myMethod1'</simple>
<to uri="log:endoint_1?showAll=true" />
</when>
<when>
<simple>${header.methodName} == 'myMethod2'</simple>
<to uri="log:endoint_2?showAll=true" />
</when>
<otherwise>
<throwException ref="unsupportedException" />
</otherwise>
</choice>
</route>
</camelContext>
Please note that I've not tested yet the above route!!
And again, any improvement is welcome. ;-)
Cristiano
2013/7/11 Claus Ibsen <[email protected]>
> Hi
>
> Ah yeah the null safe doesn't apply for methods not found.
> I am not sure if this is a good idea to add support for that. As if
> you have a typo in the method name, then the null safe will ignore
> that also.
>
> And adding more stuff to the syntax would just confuse even more, eg
>
> For example with a double ?? to indicate ignore method not found.
>
> ${body??.method??.name}
>
> The ? is null safe, so its if the getMethod returns null, then break
> out of the OGNL path.
>
>
>
>
>
> On Wed, Jul 10, 2013 at 7:01 PM, Cristiano Costantini
> <[email protected]> wrote:
> > mmmm,
> > I would need exactly that, but I've tested sending a string with a
> producer
> > template and I got this error:
> >
> > Failed to invoke method: ?.method?.name on null due to:
> > org.apache.camel.language.bean.RuntimeBeanExpressionException: Failed to
> > invoke method: method on null due to:
> > org.apache.camel.component.bean.MethodNotFoundException: Method with
> name:
> > method not found on bean: Hello World! of type: java.lang.String.
> > Exchange[Message: Hello World!]
> >
> > caused by
> >
> > Failed to invoke method: method on null due to:
> > org.apache.camel.component.bean.MethodNotFoundException: Method with
> name:
> > method not found on bean: Hello World! of type: java.lang.String.
> > Exchange[Message: Hello World!]
> >
> >
> > again caused by
> >
> >
> > Method with name: method not found on bean: Hello World! of type:
> > java.lang.String. Exchange[Message: Hello World!]
> >
> >
> > I'm using camel 2.10.4...
> > Any suggestion?
> >
> > Thanks,
> > Cristiano
> >
> >
> >
> >
> >
> >
> > 2013/7/10 Claus Ibsen <[email protected]>
> >
> >> There is a ? operator, so you can do
> >>
> >> <simple>${body?.method?.name</simple>
> >>
> >> Then it will be null if the body if the body doesnt have a
> >> getMethod().getName()
> >>
> >> There is also a bodyAs(type) to use the Camel type converter.
> >>
> >>
> >>
> >> On Wed, Jul 10, 2013 at 4:48 PM, Cristiano Costantini
> >> <[email protected]> wrote:
> >> > mmm, it seems that "<simple>${body.method.name}</simple>" works:
> >> >
> >> > <setHeader headerName="methodName">
> >> > <simple>${body.method.name}</simple>
> >> > </setHeader>
> >> >
> >> >
> >> > Any comment about this solution? (is it good?)
> >> >
> >> > What happens if the body is not of class
> >> > org.apache.camel.component.bean.BeanInvocation?
> >> > Is there a way to check if body is of the right instance?
> >> >
> >> > Many thanks!!!
> >> >
> >> > Cristiano
> >> >
> >> >
> >> >
> >> >
> >> >
> >> > 2013/7/10 Cristiano Costantini <[email protected]>
> >> >
> >> >> Hi All,
> >> >>
> >> >> I have a Camel Proxy that pushes "BeanInvokation" exchanges to a
> camel
> >> >> route, and I want to route these messages depending on the method
> name
> >> that
> >> >> is invoked.
> >> >>
> >> >> Is there any way to extract this information and put into an header
> so
> >> to
> >> >> use it in a <choice>?
> >> >>
> >> >>
> >> >> For example, considering the following XML code:
> >> >>
> >> >> <camelContext id="camelContext" xmlns="
> >> >> http://camel.apache.org/schema/spring">
> >> >> <proxy id="myServiceProxy" serviceInterface="org.example.MyService"
> >> >> serviceUrl="direct:entry" />
> >> >>
> >> >> <route>
> >> >> <from uri="direct:entry" />
> >> >> <setHeader headerName="methodName">
> >> >> <?? how to extract the method name ??>
> >> >> </setHeader>
> >> >>
> >> >> <choice>
> >> >> <when>
> >> >> <simple>${header.methodName} == 'myMethod1'</simple>
> >> >> <to uri="log:endoint_1?showAll=true" />
> >> >> </when>
> >> >> <when>
> >> >> <simple>${header.methodName} == 'myMethod2'</simple>
> >> >> <to uri="log:endoint_2?showAll=true" />
> >> >> </when>
> >> >> <otherwise>
> >> >> <throwException ref="unsupportedException" />
> >> >> </otherwise>
> >> >> </choice>
> >> >> </route>
> >> >> </camelContext>
> >> >>
> >> >>
> >> >> I'm searching for a solution to be used between the two <setHeader>
> >> tags.
> >> >>
> >> >> I know I can write a processor, but I will have problems deploying
> it to
> >> >> the classpath where I put the route, so I need a solution that rely
> on
> >> the
> >> >> default camel capability (like using simple language or other
> expression
> >> >> languages available with camel).
> >> >>
> >> >>
> >> >> Any idea?
> >> >> Thank you all!
> >> >>
> >> >> Cristiano
> >> >>
> >> >>
> >> >>
> >>
> >>
> >>
> >> --
> >> Claus Ibsen
> >> -----------------
> >> Red Hat, Inc.
> >> Email: [email protected]
> >> Twitter: davsclaus
> >> Blog: http://davsclaus.com
> >> Author of Camel in Action: http://www.manning.com/ibsen
> >>
>
>
>
> --
> Claus Ibsen
> -----------------
> Red Hat, Inc.
> Email: [email protected]
> Twitter: davsclaus
> Blog: http://davsclaus.com
> Author of Camel in Action: http://www.manning.com/ibsen
>