You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by rhowlett <rh...@silverchalice.com> on 2012/07/09 21:46:39 UTC

RecipientList with bean method to set HTTP endpoint string

I'm using the Java DSL to do something akin to the following:

from("xxx")
	.setBody("<root><p>Hi</p></root>")
	.recipientList(method(MyBean.class, "myMethod"))
.end()

MyBean's myMethod() method is intended to calculate the HTTP endpoint to
call:

public String myMethod(
	@Body String body, 
	@Headers Map<String, Object> inHeaders,
	@OutHeaders Map<String, Object> outHeaders,
	Exchange exchange
) {
	outHeaders = inHeaders;

	outHeaders.put(Exchange.HTTP_METHOD, "GET");
	exchange.getIn().setBody(null);

	return "http://somewebservice.com";
}

The problem is because the body of the Exchange's In Message going into the
recipient list method is not null, an InvalidPayloadException is therefore
thrown.

Setting the body within the method has no effect because it seems the
component used by the method's return value is passed the pre-recipient list
method's body.

What I'm doing now is using two methods, one pre-recipientList method to
calculate/set the headers etc., and the recipientList's method itself just
returns the HTTP string now. 

What better ways are there of doing this? It would be nice to solve it with
one method. Use the HTTP component class directly?

Thanks, R

--
View this message in context: http://camel.465427.n5.nabble.com/RecipientList-with-bean-method-to-set-HTTP-endpoint-string-tp5715771.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: RecipientList with bean method to set HTTP endpoint string

Posted by rhowlett <rh...@silverchalice.com>.
Using the @RecipientList annotation worked. The new component receives the
exchange that was modified by the bean method. Thanks Claus.


On Tue, Jul 10, 2012 at 12:33 AM, Claus Ibsen-2 [via Camel] <
ml-node+s465427n5715793h58@n5.nabble.com> wrote:

> Hi
>
> There is a @RecipientList annotation you can use in a method in a bean.
> And then use a bean in the DSL, eg either .bean / .beanRef / or
> .to("bean:xxx") etc.
>
> Your use-case is a bit unusual as you set the body to null, and
> therefore accesses the Exchange directly.
>
> And accordingly to the EIPs you would need 2 eips for that
> - message translator
> - recipient list
>
> So in the end you may need to use 2 eips. But you can give the
> @RecipientList a try.
>
>
> On Mon, Jul 9, 2012 at 9:46 PM, rhowlett <[hidden email]<http://user/SendEmail.jtp?type=node&node=5715793&i=0>>
> wrote:
>
> > I'm using the Java DSL to do something akin to the following:
> >
> > from("xxx")
> >         .setBody("<root><p>Hi</p></root>")
> >         .recipientList(method(MyBean.class, "myMethod"))
> > .end()
> >
> > MyBean's myMethod() method is intended to calculate the HTTP endpoint to
> > call:
> >
> > public String myMethod(
> >         @Body String body,
> >         @Headers Map<String, Object> inHeaders,
> >         @OutHeaders Map<String, Object> outHeaders,
> >         Exchange exchange
> > ) {
> >         outHeaders = inHeaders;
> >
> >         outHeaders.put(Exchange.HTTP_METHOD, "GET");
> >         exchange.getIn().setBody(null);
> >
> >         return "http://somewebservice.com";
> > }
> >
> > The problem is because the body of the Exchange's In Message going into
> the
> > recipient list method is not null, an InvalidPayloadException is
> therefore
> > thrown.
> >
> > Setting the body within the method has no effect because it seems the
> > component used by the method's return value is passed the pre-recipient
> list
> > method's body.
> >
> > What I'm doing now is using two methods, one pre-recipientList method to
> > calculate/set the headers etc., and the recipientList's method itself
> just
> > returns the HTTP string now.
> >
> > What better ways are there of doing this? It would be nice to solve it
> with
> > one method. Use the HTTP component class directly?
> >
> > Thanks, R
> >
> > --
> > View this message in context:
> http://camel.465427.n5.nabble.com/RecipientList-with-bean-method-to-set-HTTP-endpoint-string-tp5715771.html
> > Sent from the Camel - Users mailing list archive at Nabble.com.
>
>
>
> --
> Claus Ibsen
> -----------------
> FuseSource
> Email: [hidden email]<http://user/SendEmail.jtp?type=node&node=5715793&i=1>
> Web: http://fusesource.com
> Twitter: davsclaus, fusenews
> Blog: http://davsclaus.com
> Author of Camel in Action: http://www.manning.com/ibsen
>
>
> ------------------------------
>  If you reply to this email, your message will be added to the discussion
> below:
>
> http://camel.465427.n5.nabble.com/RecipientList-with-bean-method-to-set-HTTP-endpoint-string-tp5715771p5715793.html
>  To unsubscribe from RecipientList with bean method to set HTTP endpoint
> string, click here<http://camel.465427.n5.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=5715771&code=cmhvd2xldHRAc2lsdmVyY2hhbGljZS5jb218NTcxNTc3MXw1Nzk3MjE5MjQ=>
> .
> NAML<http://camel.465427.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml>
>


--
View this message in context: http://camel.465427.n5.nabble.com/RecipientList-with-bean-method-to-set-HTTP-endpoint-string-tp5715771p5715817.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Re: RecipientList with bean method to set HTTP endpoint string

Posted by Claus Ibsen <cl...@gmail.com>.
Hi

There is a @RecipientList annotation you can use in a method in a bean.
And then use a bean in the DSL, eg either .bean / .beanRef / or
.to("bean:xxx") etc.

Your use-case is a bit unusual as you set the body to null, and
therefore accesses the Exchange directly.

And accordingly to the EIPs you would need 2 eips for that
- message translator
- recipient list

So in the end you may need to use 2 eips. But you can give the
@RecipientList a try.


On Mon, Jul 9, 2012 at 9:46 PM, rhowlett <rh...@silverchalice.com> wrote:
> I'm using the Java DSL to do something akin to the following:
>
> from("xxx")
>         .setBody("<root><p>Hi</p></root>")
>         .recipientList(method(MyBean.class, "myMethod"))
> .end()
>
> MyBean's myMethod() method is intended to calculate the HTTP endpoint to
> call:
>
> public String myMethod(
>         @Body String body,
>         @Headers Map<String, Object> inHeaders,
>         @OutHeaders Map<String, Object> outHeaders,
>         Exchange exchange
> ) {
>         outHeaders = inHeaders;
>
>         outHeaders.put(Exchange.HTTP_METHOD, "GET");
>         exchange.getIn().setBody(null);
>
>         return "http://somewebservice.com";
> }
>
> The problem is because the body of the Exchange's In Message going into the
> recipient list method is not null, an InvalidPayloadException is therefore
> thrown.
>
> Setting the body within the method has no effect because it seems the
> component used by the method's return value is passed the pre-recipient list
> method's body.
>
> What I'm doing now is using two methods, one pre-recipientList method to
> calculate/set the headers etc., and the recipientList's method itself just
> returns the HTTP string now.
>
> What better ways are there of doing this? It would be nice to solve it with
> one method. Use the HTTP component class directly?
>
> Thanks, R
>
> --
> View this message in context: http://camel.465427.n5.nabble.com/RecipientList-with-bean-method-to-set-HTTP-endpoint-string-tp5715771.html
> Sent from the Camel - Users mailing list archive at Nabble.com.



-- 
Claus Ibsen
-----------------
FuseSource
Email: cibsen@fusesource.com
Web: http://fusesource.com
Twitter: davsclaus, fusenews
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen