315.3. サンプル

315.3.1. 式テンプレート

式のテンプレート化が有効になっているため、SpEL 式は #{ } 区切り記号で囲む必要があります。これにより、SpEL 式を通常のテキストと組み合わせて、これを非常に軽量なテンプレート言語として使用できます。

たとえば、次のルートを構築するとします。

from("direct:example")
    .setBody(spel("Hello #{request.body}! What a beautiful #{request.headers['dayOrNight']}"))
    .to("mock:result");

上記のルートで、spel は org.apache.camel.language.spel.SpelExpression.spel からインポートする必要がある静的メソッドであることに注意してください。これは、setBody メソッドにパラメーターとして渡される Expression として spel を使用するためです。fluent API を使用する場合は、代わりにこれを行うことができます。

from("direct:example")
    .setBody().spel("Hello #{request.body}! What a beautiful #{request.headers['dayOrNight']}")
    .to("mock:result");

setBody() メソッドの spel メソッドを使用していることに注意してください。そして、これは org.apache.camel.language.spel.SpelExpression.spel から spel メソッドを静的にインポートする必要はありません。

そして、本文に文字列 World、ヘッダー dayOrNight、値 day を含むメッセージを送信しました。

template.sendBodyAndHeader("direct:example", "World", "dayOrNight", "day");

mock:result の出力は、"Hello World!What a beautiful day" となります。

315.3.2. Bean インテグレーション

SpEL 式で、レジストリー (ほとんどの場合 ApplicationContext) で定義された Bean を参照できます。たとえば、ApplicationContext に foo という名前の Bean がある場合、次のようにこの Bean で bar メソッドを呼び出すことができます。

#{@foo.bar == 'xyz'}

315.3.3. エンタープライズ統合パターンでの SpEL

Recipient List の式として、または Message Filter 内の述語として SpEL を使用できます。

<route>
  <from uri="direct:foo"/>
  <filter>
    <spel>#{request.headers['foo'] == 'bar'}</spel>
    <to uri="direct:bar"/>
  </filter>
</route>

そして、Java DSL で同等のもの:

from("direct:foo")
    .filter().spel("#{request.headers['foo'] == 'bar'}")
    .to("direct:bar");