Parameter Binding Annotations
Info | ||
---|---|---|
| ||
The annotations below are all part of camel-core and thus does not require camel-spring or Spring. These annotations can be used with the Bean component or when invoking beans in the DSL |
Annotations can be used to define an Expression or to extract various headers, properties or payloads from a Message when invoking a bean method (see Bean Integration for more detail of how to invoke bean methods) together with being useful to help disambiguate which method to invoke.
If no annotations are used then Camel assumes that a single parameter is the body of the message. Camel will then use the Type Converter mechanism to convert from the expression value to the actual type of the parameter.
The core annotations are as follows
Annotation | Meaning | Parameter |
---|---|---|
To bind to an inbound message body |
| |
To bind to an Exception set on the exchange |
| |
To bind to an inbound message header | String name of the header | |
To bind to the Map of the inbound message headers |
| |
To bind to the Map of the outbound message headers |
| |
To bind to a named property on the exchange | String name of the property | |
To bind to the property map on the exchange |
| |
Not part as a type parameter but stated in this table anyway to spread the good word that we have this annotation in Camel now. See more at Bean Binding. |
|
The follow annotations @Headers
, @OutHeaders
and @Properties
binds to the backing java.util.Map
so you can alter the content of these maps directly, for instance using the put
method to add a new entry. See the OrderService class at Exception Clause for such an example. You can use @Header("myHeader")
and @Property("myProperty")
to access the backing java.util.Map
.
Example
In this example below we have a @Consume consumer (like message driven) that consumes JMS messages from the activemq queue. We use the @Header and @Body parameter binding annotations to bind from the JMSMessage to the method parameters.
Code Block |
---|
public class Foo { @Consume(uri = "activemq:my.queue") public void doSomething(@Header("JMSCorrelationID") String correlationID, @Body String body) { // process the inbound message here } } |
In the above Camel will extract the value of Message.getJMSCorrelationID(), then using the Type Converter to adapt the value to the type of the parameter if required - it will inject the parameter value for the correlationID parameter. Then the payload of the message will be converted to a String and injected into the body parameter.
You don't necessarily need to use the @Consume annotation if you don't want to as you could also make use of the Camel DSL to route to the bean's method as well.
Using the DSL to invoke the bean method
Here is another example which does not use POJO Consuming annotations but instead uses the DSL to route messages to the bean method
Code Block |
---|
public class Foo { public void doSomething(@Header("JMSCorrelationID") String correlationID, @Body String body) { // process the inbound message here } } |
The routing DSL then looks like this
Code Block |
---|
from("activemq:someQueue"). to("bean:myBean"); |
Here myBean would be looked up in the Registry (such as JNDI or the Spring ApplicationContext), then the body of the message would be used to try figure out what method to call.
If you want to be explicit you can use
Code Block |
---|
from("activemq:someQueue"). to("bean:myBean?methodName=doSomething"); |
And here we have a nifty example for you to show some great power in Camel. You can mix and match the annotations with the normal parameters, so we can have this example with annotations and the Exchange also:
Code Block |
---|
public void doSomething(@Header("user") String user, @Body String body, Exchange exchange) { exchange.getIn().setBody(body + "MyBean"); } |
Include Page | ||||
---|---|---|---|---|
|