Chapter 31. SpEL
Overview
The Spring Expression Language (SpEL) is an object graph navigation language provided with Spring 3, which can be used to construct predicates and expressions in a route. A notable feature of SpEL is the ease with which you can access beans from the registry.
Syntax
The SpEL expressions must use the placeholder syntax, #{SpelExpression}
, so that they can be embedded in a plain text string (in other words, SpEL has expression templating enabled).
SpEL can also look up beans in the registry (typically, the Spring registry), using the @BeanID
syntax. For example, given a bean with the ID, headerUtils
, and the method, count()
(which counts the number of headers on the current message), you could use the headerUtils
bean in an SpEL predicate, as follows:
#{@headerUtils.count > 4}
Adding SpEL package
To use SpEL in your routes you need to add a dependency on camel-spring
to your project as shown in Example 31.1, “Adding the camel-spring dependency”.
Example 31.1. Adding the camel-spring dependency
<!-- Maven POM File --> <properties> <camel-version>2.21.0.fuse-760027-redhat-00001</camel-version> ... </properties> <dependencies> ... <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-spring</artifactId> <version>${camel-version}</version> </dependency> ... </dependencies>
Variables
Table 31.1, “SpEL variables” lists the variables that are accessible when using SpEL.
Variable | Type | Description |
---|---|---|
|
| The current exchange is the root object. |
|
| The current exchange. |
|
| The current exchange’s ID. |
|
| The exchange exception (if any). |
|
| The fault message (if any). |
|
| The exchange’s In message. |
|
| The exchange’s Out message (if any). |
|
| The exchange properties. |
|
| The exchange property keyed by Name. |
|
| The exchange property keyed by Name, converted to the type, Type. |
XML example
For example, to select only those messages whose Country
header has the value USA
, you can use the following SpEL expression:
<route> <from uri="SourceURL"/> <filter> <spel>#{request.headers['Country'] == 'USA'}}</spel> <to uri="TargetURL"/> </filter> </route>
Java example
You can define the same route in the Java DSL, as follows:
from("SourceURL") .filter().spel("#{request.headers['Country'] == 'USA'}") .to("TargetURL");
The following example shows how to embed SpEL expressions within a plain text string:
from("SourceURL") .setBody(spel("Hello #{request.body}! What a beautiful #{request.headers['dayOrNight']}")) .to("TargetURL");