30.4. 式
概要
Simple 言語は、メッセージエクスチェンジの各種パーツを返すさまざまな式を提供します。たとえば、式 simple("${header.timeOfDay}") は、受信メッセージからの timeOfDay というヘッダーの内容を返します。
Apache Camel 2.9 以降、変数の値を返すには、常に プレースホルダー構文の ${Expression} を使用する必要があります。エンクロージングトークン ${ および }) を省略することは許容されません。
単一変数の内容
用意された変数に基づいて、Simple 言語を使い、文字列式を定義できます。たとえば、in.header.HeaderName という形式の変数を使用して、以下のように HeaderName ヘッダーの値を取得できます。
simple("${in.header.foo}")文字列に組み込まれた変数
simple 変数を文字列式に埋め込むことができます。以下に例を示します。
simple("Received a message from ${in.header.user} on ${date:in.header.date:yyyyMMdd}.")date および bean 変数
Simple 言語は、エクスチェンジのさまざまな部分にアクセスする変数を提供するだけでなく (表30.1「Simple 言語の変数」 を参照)、日付をフォーマットするための特別な変数である date:command:pattern を提供し、Bean メソッドを呼び出すための特別な変数である bean:beanRef も提供します。たとえば、以下のように date および bean 変数を使用できます。
simple("Todays date is ${date:now:yyyyMMdd}")
simple("The order type is ${bean:orderService?method=getOrderType}")結果の型指定
式の結果の型を明示的に指定できます。これは主に、結果の型をブール値や数値型に変換するのに便利です。
Java DSL では、simple() への追加引数として結果の型を指定します。たとえば、整数の結果を返すには、以下のように Simple 式を評価できます。
...
.setHeader("five", simple("5", Integer.class))
XML DSL では、resultType 属性を使用して結果の型を指定します。以下に例を示します。
<setHeader headerName="five">
<!-- use resultType to indicate that the type should be a java.lang.Integer -->
<simple resultType="java.lang.Integer">5</simple>
</setHeader>動的ヘッダーキー
Camel 2.17 から、setHeader および setExchange プロパティーで、キーの名前に Simple 言語式を使用している場合に Simple 言語による動的ヘッダーキーを使用できるようになりました。
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="direct:start"/>
<setHeader headerName="$simple{type:org.apache.camel.spring.processor.SpringSetPropertyNameDynamicTest$TestConstans.EXCHANGE_PROP_TX_FAILED}">
<simple>${type:java.lang.Boolean.TRUE}</simple>
</setHeader>
<to uri="mock:end"/>
</route>
</camelContext>ネストされた式
Simple 式は入れ子にすることができます。以下に例を示します。
simple("${header.${bean:headerChooser?method=whichHeader}}")定数または列挙型へのアクセス
以下の構文を使用し、Bean の定数または列挙フィールドにアクセスすることができます。
type:ClassName.Field
たとえば、以下の Java enum 型を見てみましょう。
package org.apache.camel.processor;
...
public enum Customer {
GOLD, SILVER, BRONZE
}
以下のように Customer enum フィールドにアクセスできます。
from("direct:start")
.choice()
.when().simple("${header.customer} ==
${type:org.apache.camel.processor.Customer.GOLD}")
.to("mock:gold")
.when().simple("${header.customer} ==
${type:org.apache.camel.processor.Customer.SILVER}")
.to("mock:silver")
.otherwise()
.to("mock:other");OGNL 式
Object Graph Navigation Language (OGNL) は、チェーン状に Bean メソッドを呼び出す表記法です。メッセージボディーに Java Bean が含まれる場合、OGNL 表記を使用して Bean プロパティーに簡単にアクセスすることができます。たとえば、メッセージボディーが getAddress() アクセサーを持つ Java オブジェクトである場合、以下のように Address オブジェクトと Address オブジェクトのプロパティーにアクセスできます。
simple("${body.address}")
simple("${body.address.street}")
simple("${body.address.zip}")
simple("${body.address.city}")
ここで、表記 ${body.address.street} は、${body.getAddress.getStreet} の省略形になります。
OGNL null-safe 演算子
null-safe 演算子 ?. を使用して、ボディーに address が ない 場合に null-pointer 例外が発生しないようにすることができます。以下に例を示します。
simple("${body?.address?.street}")
ボディーが java.util.Map 型である場合、以下の表記法を使用して、 foo キーでマップの値を検索することができます。
simple("${body[foo]?.name}")OGNL リスト要素へのアクセス
リスト要素にアクセスするには、角括弧 [k] を使用することもできます。以下に例を示します。
simple("${body.address.lines[0]}")
simple("${body.address.lines[1]}")
simple("${body.address.lines[2]}")
last キーワードは、リストの最後の要素のインデックスを返します。たとえば、以下のようにリストの 最後から 2 番目 の要素にアクセスできます。
simple("${body.address.lines[last-1]}")
size メソッドを使用して、以下のようにリストのサイズを問い合わせることができます。
simple("${body.address.lines.size}")OGNL 配列の長さへのアクセス
以下のように、length メソッドを使用して Java 配列の長さにアクセスできます。
String[] lines = new String[]{"foo", "bar", "cat"};
exchange.getIn().setBody(lines);
simple("There are ${body.length} lines")