第22章 JXPath
概要
JXPath を使用すると、Apache Commons JXPath で Java Bean のメソッドを呼び出すことができます。JXPath は XPath に似た構文です。対照的に、XML ドキュメントの要素や属性のノードにアクセスのではなく、Java Bean のオブジェクトのメソッドや属性にアクセスします。さらに、ある Bean の属性が XML ドキュメント (DOM/JDOM インスタンス) となっている場合、パスの残り部分は XPath 式として解釈され、XML ドキュメントから XML ノードの抽出に使用されます。言い換えれば、JXPath 言語はオブジェクトグラフのナビゲーションと XML ノード選択のハイブリッドを提供します。
JXPath パッケージの追加
ルートで JXPath を使用するには、例22.1「camel-jxpath 依存関係の追加」 で示したように、camel-jxpath
の依存関係をプロジェクトに追加する必要があります。
例22.1 camel-jxpath 依存関係の追加
<!-- Maven POM File --> <properties> <camel-version>2.23.2.fuse-7_10_0-00018-redhat-00001</camel-version> ... </properties> <dependencies> ... <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jxpath</artifactId> <version>${camel-version}</version> </dependency> ... </dependencies>
変数
表22.1「JXPath 変数」 に、JXPath を使用する際にアクセス可能な組み込み変数の一覧を示します。
変数 | 型 | 値 |
---|---|---|
|
| 現在のエクスチェンジ |
|
| IN メッセージ |
|
| OUT メッセージ |
オプション
表22.2「JXPath オプション」 では、JXPath のオプションを説明します。
オプション | 型 | 説明 |
---|---|---|
|
| Camel 2.11/2.10.5: JXPathContext で lenient を有効化します。このオプションを有効すると、JXPath 式は、無効なデータや欠落したデータである可能性のあるメッセージボディや式に対して評価することができます。詳細は JXPath ドキュメント を参照してください。このオプションはデフォルトで false です。 |
例
以下は JXPath を使用したルールを示しています。
<camelContext> <route> <from uri="activemq:MyQueue"/> <filter> <jxpath>in/body/name = 'James'</xpath> <to uri="mqseries:SomeOtherQueue"/> </filter> </route> </camelContext>
以下の例では、メッセージフィルターの判定式として JXPath 式を使用しています。
from("direct:start"). filter().jxpath("in/body/name='James'"). to("mock:result");
JXPath の注入
Bean インテグレーションを使用して Bean のメソッドを呼び出す場合、JXPath (他の 言語も使用可) を使用してメッセージから値を抽出し、メソッドパラメーターにバインドすることができます。
以下に例を示します。
public class Foo { @MessageDriven(uri = "activemq:my.queue") public void doSomething(@JXPath("in/body/foo") String correlationID, @Body String body) { // process the inbound message here } }
外部リソースからの読み込み
Camel 2.11 から利用可能
スクリプトを外部化して、"classpath:"
、"file:"
、または "http:"
などのリソースから Camel に読み込むことができます。以下の構文を使用してください。
"resource:scheme:location"
たとえば、クラスパスのファイルを読み込むには、次のように指定します。
.setHeader("myHeader").jxpath("resource:classpath:myjxpath.txt")