MVEL
Since Camel 2.0
Camel supports MVEL to do message transformations using MVEL templates.
MVEL is powerful for templates, but can also be used for Expression or Predicate
For example, you can use MVEL in a Predicate with the Content-Based Router EIP.
You can use MVEL dot notation to invoke operations. If you for instance have a body that contains a POJO that has a getFamilyName method then you can construct the syntax as follows:
request.body.familyName Or use similar syntax as in Java:
getRequest().getBody().getFamilyName() MVEL Options
The MVEL language supports the following options which are listed below.
| Name | Default | Java Type | Description |
|---|---|---|---|
| The class of the result type (type from output). | ||
|
| Whether to trim the source code to remove leading and trailing whitespaces and line breaks. | |
|
| Whether a result of the expression that is a String starting with resource: is loaded as a resource and its content becomes the result, e.g. a script that returns resource:file:order.json or resource:classpath:templates/order.json (a name without a scheme is a classpath resource). Off by default; the resource: prefix on the expression text itself is always resolved. Applies to the expression used as a value, not as a predicate. |
Variables
The following Camel related variables are made available:
| Variable | Type | Description |
|---|---|---|
this | Exchange | the Exchange is the root object |
context | CamelContext | the CamelContext |
exchange | Exchange | the Exchange |
exchangeId | String | the exchange id |
exception | Throwable | the Exchange exception (if any) |
request | Message | the message |
message | Message | the message |
headers | Map | the message headers |
header(name) | Object | the message header by the given name |
header(name, type) | Type | the message header by the given name as the given type |
properties | Map | the exchange properties |
property(name) | Object | the exchange property by the given name |
property(name, type) | Type | the exchange property by the given name as the given type |
Example
For example, you could use MVEL inside a Message Filter
-
Java
-
XML
-
YAML
from("seda:foo")
.filter().mvel("headers.foo == 'bar'")
.to("seda:bar"); <route>
<from uri="seda:foo"/>
<filter>
<mvel>headers.foo == 'bar'</mvel>
<to uri="seda:bar"/>
</filter>
</route> - route:
from:
uri: seda:foo
steps:
- filter:
expression:
mvel:
expression: headers.foo == 'bar'
steps:
- to:
uri: seda:bar Loading script from external resource
You can externalize the script and have Apache Camel load it from a resource such as "classpath:", "file:", or "http:". This is done using the following syntax: "resource:scheme:location", e.g., to refer to a file on the classpath you can do:
.setHeader("myHeader").mvel("resource:classpath:script.mvel") Dependencies
To use MVEL in your Camel routes, you need to add the dependency on camel-mvel which implements the MVEL language.
If you use Maven, you could add the following to your pom.xml, substituting the version number for the latest & greatest release.
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-mvel</artifactId>
<version>x.x.x</version>
</dependency>