Spring _expression_ Language (SpEL)
Available as of Camel 2.7
Camel allows SpEL to be used as an _expression_ or Predicate in the DSL or Xml Configuration.
Variables
The following variables are available in expressions and predicates written in SpEL:
Variable |
Type |
Description |
this |
Exchange |
the Exchange is the root object |
exchange |
Exchange |
the Exchange object |
exception |
Throwable |
the Exchange exception (if any) |
exchangeId |
String |
the exchange id |
fault |
Message |
the Fault message (if any) |
body |
Object |
Camel 2.11: The IN message body. |
request |
Message |
the exchange.in message |
response |
Message |
the exchange.out message (if any) |
properties |
Map |
the exchange properties |
property(name) |
Object |
the property by the given name |
property(name, type) |
Type |
the property by the given name as the given type |
Samples
_expression_ templating
SpEL expressions need to be surrounded by #{ } delimiters since _expression_ templating is enabled. This allows you to combine SpEL expressions with regular text and use this as extremely lightweight template language.
For example if you construct the following route:
from("direct:example").setBody(spel("Hello #{request.body}! What a beautiful #{request.headers['dayOrNight']}")).to("mock:result");
And sent a message with the string "World" in the body, and a header "dayOrNight" with value "day":
template.sendBodyAndHeader("direct:example", "World", "dayOrNight", "day");
The output on mock:result will be "Hello World! What a beautiful day"
Bean integration
You can reference beans defined in the Registry (most likely an ApplicationContext) in your SpEL expressions. For example if you have a bean named "foo" in your ApplicationContext you can invoke the "bar" method on this bean like this:
SpEL in enterprise integration patterns
You can use SpEL as an _expression_ for Recipient List or as a predicate inside a Message Filter:
<route>
<from uri="direct:foo"/>
<filter>
<spel>#{request.headers['foo'] == 'bar'}</spel>
<to uri="direct:bar"/>
</filter>
</route>
And the equivalent in Java DSL:
from("direct:foo").filter().spel("#{request.headers['foo'] == 'bar'}").to("direct:bar");
Dependencies
You need Spring 3.0 or higher to use Spring _expression_ Language. If you use Maven you could just add the following to your pom.xml:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring</artifactId>
<version>xxx</version>
</dependency>