You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by "Glattfelder, Beat " <be...@credit-suisse.com> on 2014/05/26 16:32:07 UTC

Java DSL Question - revisited

Hi again

I need to clarify that I want to access members of the Object  in the body, which is a HashMap,  from within the DSL. From a Processor I can access the Object as such:



// works

exchange.getIn().getBody(Map.class).get("user_name"));



In the fluent builder, like in the following example, this does not work since the body() method returns a ValueBuilder Object so the following code won't compile.



// won't compile

.split(body())

setHeader("uid").body(Map.class).get("user_name"));



What am I missing here?





>>>>>>>>





The body part of the camel exchange object (exchange.getIn().getBody())

after the split contain the string. So the syntax (to be typesafe) is



.split(body())

setHeader("uid").body(String.class)





On Wed, May 21, 2014 at 11:19 AM, Glattfelder, Beat <

beat.glattfelder@credit-suisse.com<ma...@credit-suisse.com>> wrote:



> Hi Camel Riders

>

> I am back with a simple question I found to tough to answer myself: How do

> I access the message body in a typesafe manner like in the TODO comment

> below? Obviously implementing a processor works fine, but make things

> harder to read.

>

> Thanks for advising,

> Beat

>

>

>     from("direct:start-profile-pics")

>

>                                     .to("sql:select * from cwd_user where

> active='T' and directory_id=76644354?dataSource=confDB")

>

>                                     .split(body())

>

>                                     // TODO: setHeader("uid",

> bodyAsType(Map.class).get("username"));

>

>                                     .process(new Processor() {

>

>

>                                                    @Override

>

>                                                    public void

> process(Exchange exchange)

>

>

>        throws Exception {

>

>                                                                    Message

> msg = exchange.getIn();

>

>

>  msg.setHeader("uid", msg.getBody(Map.class)

>

>

>                       .get("user_name"));

>

>

>  msg.setHeader(Exchange.HTTP_PATH, "avatar/" + msg.getBody(Map.class)

>

>

>                       .get("user_name"));

>

>

>                                                    }

>

>                                     })

>

>                                     .setBody(constant(null))

>

>                                     .to("http4://

> unity-uat.apps.csintra.net/")

>

>                                     .bean(applicationContext

>

>

>  .getBean("confluenceClient"),

>

>

>  "updateProfilePic");

>







--

Charles Moulliard

Apache Committer / Architect @RedHat

Twitter : @cmoulliard | Blog :  http://cmoulliard.github.io


AW: Java DSL Question - revisited

Posted by "Jan Matèrne (jhm)" <ap...@materne.de>.
In the Processor you define the access path during "runtime":
you have one exchange as input.

In the RouteBuilder you define the access path during "design time":
what is to do for _every_ incoming exchange (and some may not have a hashmap
as body...).


But i am sure that you could use simple language for achieving your goal ...
https://camel.apache.org/simple.html
Maybe:
setHeader("uid").simple("${body[user_name]}")


Jan

> -----Ursprüngliche Nachricht-----
> Von: Glattfelder, Beat [mailto:beat.glattfelder@credit-suisse.com]
> Gesendet: Montag, 26. Mai 2014 16:32
> An: users@camel.apache.org
> Betreff: Java DSL Question - revisited
> 
> Hi again
> 
> I need to clarify that I want to access members of the Object  in the
> body, which is a HashMap,  from within the DSL. From a Processor I can
> access the Object as such:
> 
> 
> 
> // works
> 
> exchange.getIn().getBody(Map.class).get("user_name"));
> 
> 
> 
> In the fluent builder, like in the following example, this does not
> work since the body() method returns a ValueBuilder Object so the
> following code won't compile.
> 
> 
> 
> // won't compile
> 
> .split(body())
> 
> setHeader("uid").body(Map.class).get("user_name"));
> 
> 
> 
> What am I missing here?
> 
> 
> 
> 
> 
> >>>>>>>>
> 
> 
> 
> 
> 
> The body part of the camel exchange object (exchange.getIn().getBody())
> 
> after the split contain the string. So the syntax (to be typesafe) is
> 
> 
> 
> .split(body())
> 
> setHeader("uid").body(String.class)
> 
> 
> 
> 
> 
> On Wed, May 21, 2014 at 11:19 AM, Glattfelder, Beat <
> 
> beat.glattfelder@credit-suisse.com<mailto:beat.glattfelder@credit-
> suisse.com>> wrote:
> 
> 
> 
> > Hi Camel Riders
> 
> >
> 
> > I am back with a simple question I found to tough to answer myself:
> How do
> 
> > I access the message body in a typesafe manner like in the TODO
> comment
> 
> > below? Obviously implementing a processor works fine, but make things
> 
> > harder to read.
> 
> >
> 
> > Thanks for advising,
> 
> > Beat
> 
> >
> 
> >
> 
> >     from("direct:start-profile-pics")
> 
> >
> 
> >                                     .to("sql:select * from cwd_user
> where
> 
> > active='T' and directory_id=76644354?dataSource=confDB")
> 
> >
> 
> >                                     .split(body())
> 
> >
> 
> >                                     // TODO: setHeader("uid",
> 
> > bodyAsType(Map.class).get("username"));
> 
> >
> 
> >                                     .process(new Processor() {
> 
> >
> 
> >
> 
> >                                                    @Override
> 
> >
> 
> >                                                    public void
> 
> > process(Exchange exchange)
> 
> >
> 
> >
> 
> >        throws Exception {
> 
> >
> 
> >
> Message
> 
> > msg = exchange.getIn();
> 
> >
> 
> >
> 
> >  msg.setHeader("uid", msg.getBody(Map.class)
> 
> >
> 
> >
> 
> >                       .get("user_name"));
> 
> >
> 
> >
> 
> >  msg.setHeader(Exchange.HTTP_PATH, "avatar/" + msg.getBody(Map.class)
> 
> >
> 
> >
> 
> >                       .get("user_name"));
> 
> >
> 
> >
> 
> >                                                    }
> 
> >
> 
> >                                     })
> 
> >
> 
> >                                     .setBody(constant(null))
> 
> >
> 
> >                                     .to("http4://
> 
> > unity-uat.apps.csintra.net/")
> 
> >
> 
> >                                     .bean(applicationContext
> 
> >
> 
> >
> 
> >  .getBean("confluenceClient"),
> 
> >
> 
> >
> 
> >  "updateProfilePic");
> 
> >
> 
> 
> 
> 
> 
> 
> 
> --
> 
> Charles Moulliard
> 
> Apache Committer / Architect @RedHat
> 
> Twitter : @cmoulliard | Blog :  http://cmoulliard.github.io