Cameleer

MVEL component

The mvel component renders an MVEL 2 template (orb tags such as @{expr} and @foreach{}) against the message and sets the rendered text as the new body.

Scheme: mvel: · Crate: cameleer-script · Cargo feature: script · Consumer: no · Producer: yes · Apache Camel: MVEL

When to use it

  • Render text with real expressions inside the template: arithmetic, method calls, ternaries.
  • Build an order summary or a prompt where values need computing, not just inserting.
  • Reuse MVEL templates from a Java Camel application.

For MVEL as an expression language (in setBody, filter...), see the MVEL language.

URI format

text
mvel:templateResource[?options]

templateResource is a file path relative to the working directory, file:path, classpath:path (read as a relative path) or ref:beanName.

Example

An order summary with a computed total, a loop with a separator and a condition.

text
Order @{body.id} for @{body.customer.toUpperCase()}: @foreach{i : body.items}@{i.qty} x @{i.sku}@end{', '}
@code{total = 0; foreach (i : body.items) { total += i.qty * i.price; }}Total: @{total}
@if{total > 50}Free shipping.@else{}Shipping: 5.@end{}
yaml example: mvel-order-summary
- route:
    id: mvel-order
    from:
      uri: direct:mvel-order
      steps:
        - unmarshal:
            json: {}
        - to: mvel:templates/order.mvel
json
{"id":42,"customer":"ada","items":[{"sku":"A1","qty":2,"price":10},{"sku":"B2","qty":1,"price":40}]}
text
Order 42 for ADA: 2 x A1, 1 x B2
Total: 60
Free shipping.

Rust DSL

rust
b.from("direct:mvel-rust")
    .unmarshal(DataFormatDefinition::json())
    .to("mvel:templates/order.mvel");

Options

optiondefaultdescription
allowTemplateFromHeaderfalseUse the CamelMvelTemplate / CamelMvelResourceUri headers when present.
contentCachefalseRead the template once; otherwise it is re-read for every message.
allowContextMapAllfalseAdd camelContext (with name) to the data model.
encodingUTF-8Accepted; templates are always read as UTF-8.

The data model: body, headers, variables, exchange, request / in, and camelContext with allowContextMapAll=true.

Supported orb tags

@{expr}, @if{cond}...@elseif{cond}...@else{}...@end{}, @foreach{x : list}...@end{} (an optional separator in @end{', '}, several iterables @foreach{a : as, b : bs}), @code{statements} (runs without output), @comment{...}, @include{'file'}, @declare{'name'}...@end{} with @includeNamed{'name'}, and @@ for a literal @. Expressions are full MVEL 2.

Message headers

headerdirectiondescription
CamelMvelTemplateinTemplate text used instead of the resource (needs allowTemplateFromHeader=true).
CamelMvelResourceUriinTemplate resource used instead of the endpoint's one (needs allowTemplateFromHeader=true).

Run it with Docker

sh
docker run --rm -v "$PWD:/routes:ro" pmsudhi/cameleer run /routes/order.camel.yaml

Common questions

How do I compute a value once and reuse it?

Assign it in @code{...} (no output), then print it with @{name}, as total in the example.

How do I put a separator between loop items?

Give @end{} an expression: @foreach{i : items}@{i}@end{', '}.

Is the mvel component the same as the MVEL language?

They share the MVEL interpreter. The component renders a template file; the language evaluates one expression inside a route step.

Found a problem?

If something on this page doesn't match what Cameleer does, or you hit a bug while building with it, please help fix it, whether you are a person or a coding agent: open an issue that describes what you saw, then fork the repository, fix it, add or update a test, run cargo test --workspace, and open a pull request. CONTRIBUTING.md explains the ground rules.

Edit this page on GitHub