Thinking about this some more the real issue is not so much direct support
for setting properties or invoking arbitrary methods because we have things
like OGNL which can do that work for us. For example, the OGNL expression:
request.body.someProperty = request.headers.foo
would do the trick for setting a property without resorting to Java.
The real problem is that there is no way to just invoke a script like this
without requiring you to do something with the result (store it in the
body, a property, a header, use the value as a filter, etc.) We need a way
to just say invoke this expression which could be in OGNL, Groovy,
Looking at the code there is the EvaluateExpressionProcessor which would be
perfect for this. It evaluates an expression and stores the result in a
property "CamelEvaluateExpressionResult". All we need is DSL to create an
instance of this.
So in Java DSL it would be something like:
.eval().ognl("request.body.someProperty = request.headers.foo")
In Spring DSL it would be something like:
The workaround for now is to do the equivalent:
On Tue, Sep 3, 2013 at 2:09 PM, Dale King wrote:
Yeah, LIKE I SAID, I know I can break out to a bean or a processor, but
that is such a heavyweight solution to do something so simple that really
should be built into Camel. You have to create a class, come up with some
meaningful name of the class, repeat that name a couple of times if using a
Spring DSL, etc.
Let's say we do it with anonymous classes in a Java DSL:
public void process(Exchange exchange) throws Exception
Or perhaps better as a bean:
bean( new Object()
public void set( @Body MyBodyType body, @Header("foo") value)
I personally would rather replace any of those with something more like
this in DSL:
This is much more obvious what is happening when looking at the route.
On Tue, Sep 3, 2013 at 1:51 PM, Claus Ibsen wrote:
On Tue, Sep 3, 2013 at 5:51 PM, Dale King wrote:
Through simple and OGNL we have nice easy ways to read the properties of
beans in the body, headers, or properties. But what I cannot find is an
easy way to invoke a setter on a bean property, but perhaps I am missing
I can certainly create a bean or processor to invoke the setter, but it
seems to me that if I am forced to do it for something as simple as setting
a property then something is missing in Camel. I try to do as much as
possible in Camel.
it, but once again bringing in a whole new language seems like overkill
just to set a property.
So 3 operations that i don't see an easy way to do in Camel without
resorting to these heavyweight solutions are:
- Set a bean property
- More generally, you should be able to invoke any method on a bean
including with parameters
- Create a new instance of a bean (possibly with parameters)
Correct me if I am wrong and there is a simple way to do these.
Well there is something called Java programming language, where you
can do all that ;)
Red Hat, Inc.
Author of Camel in Action: http://www.manning.com/ibsen