| [[spel-language]] |
| = SpEL Language |
| :page-source: components/camel-spring/src/main/docs/spel-language.adoc |
| |
| *Since Camel 2.7* |
| |
| Camel allows |
| https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#expressions[Spring Expression Language (SpEL)] |
| to be used as an Expression or Predicate in the DSL or XML Configuration. |
| |
| NOTE: It is recommended to use SpEL in Spring runtimes. However, you can |
| use SpEL in other runtimes (there may be functionality SpEL cannot do when not running in a Spring runtime) |
| |
| == Variables |
| |
| The following variables are available in expressions and predicates written in SpEL: |
| |
| [width="100%",cols="10%,10%,80%",options="header",] |
| |=== |
| |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 | 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 |
| |=== |
| |
| == Options |
| |
| // language options: START |
| The SpEL language supports 1 options, which are listed below. |
| |
| |
| |
| [width="100%",cols="2,1m,1m,6",options="header"] |
| |=== |
| | Name | Default | Java Type | Description |
| | trim | true | Boolean | Whether to trim the value to remove leading and trailing whitespaces and line breaks |
| |=== |
| // language options: END |
| |
| == 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: |
| |
| [source,java] |
| ---- |
| from("direct:example") |
| .setBody(spel("Hello #{request.body}! What a beautiful #{request.headers['dayOrNight']}")) |
| .to("mock:result"); |
| ---- |
| |
| In the route above, notice spel is a static method which we need to |
| import from `org.apache.camel.language.spel.SpelExpression.spel`, as we |
| use spel as an Expression passed in as a parameter |
| to the `setBody` method. Though if we use the fluent API we can do this |
| instead: |
| |
| [source,java] |
| ---- |
| from("direct:example") |
| .setBody().spel("Hello #{request.body}! What a beautiful #{request.headers['dayOrNight']}") |
| .to("mock:result"); |
| ---- |
| |
| Notice we now use the `spel` method from the `setBody()` method. And |
| this does not require us to static import the spel method from |
| `org.apache.camel.language.spel.SpelExpression.spel`. |
| |
| And sent a message with the string "World" in the body, and a header |
| "dayOrNight" with value "day": |
| |
| [source,java] |
| ---- |
| 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: |
| |
| [source,text] |
| ---- |
| #{@foo.bar == 'xyz'} |
| ---- |
| |
| === SpEL in enterprise integration patterns |
| |
| You can use SpEL as an expression for xref:manual::recipientList-eip.adoc[Recipient |
| List] or as a predicate inside a xref:manual::filter-eip.adoc[Message |
| Filter]: |
| |
| [source,xml] |
| ---- |
| <route> |
| <from uri="direct:foo"/> |
| <filter> |
| <spel>#{request.headers.foo == 'bar'}</spel> |
| <to uri="direct:bar"/> |
| </filter> |
| </route> |
| ---- |
| |
| And the equivalent in Java DSL: |
| |
| [source,java] |
| ---- |
| from("direct:foo") |
| .filter().spel("#{request.headers.foo == 'bar'}") |
| .to("direct:bar"); |
| ---- |
| |
| == Loading script from external resource |
| |
| *Since Camel 2.11* |
| |
| You can externalize the script and have Camel load it from a resource |
| such as `"classpath:"`, `"file:"`, or `"http:"`. + |
| This is done using the following syntax: `"resource:scheme:location"`, |
| eg to refer to a file on the classpath you can do: |
| |
| [source,java] |
| ---- |
| .setHeader("myHeader").spel("resource:classpath:myspel.txt") |
| ---- |
| |