第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-790054-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 を使用する際にアクセス可能な組み込み変数の一覧を示します。

表22.1 JXPath 変数

変数

this

org.apache.camel.Exchange

現在のエクスチェンジ

in

org.apache.camel.Message

IN メッセージ

out

org.apache.camel.Message

OUT メッセージ

オプション

表22.2「JXPath オプション」 では、JXPath のオプションを説明します。

表22.2 JXPath オプション

オプション説明

lenient

boolean

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")