DataWeave を使用した Java メソッドのコール

DataWeave ステートメントから、Mule プロジェクトにある任意の Java クラスの Java メソッドをコールできます。DataWeave では、静的メソッド (クラスの特定のインスタンスに属するメソッドではなく、Java クラスに属するメソッド) のみをコールできます。 開始する前に、DataWeave バージョン 2 (​%dw 2.0​) は Mule 4 アプリケーションを対象とすることに注意してください。Mule 3 アプリケーションの場合、Mule 3.9 ドキュメントセットの DataWeave バージョン 1 (​%dw 1.0​) の例を参照してください。他の Mule バージョンの場合は、目次の Mule Runtime バージョンセレクターを使用できます。

Java メソッドのコール

メソッドをコールする前に、まず属するクラスを DataWeave コードにインポートする必要があります。DataWeave モジュールをインポートするときのように、​java!​ をステートメントに含めて Java クラスをインポートできます。

たとえば、以下は文字列の最後に乱数を追加する 1 つのメソッドがある簡単な Java クラスです。このクラスは、Mule プロジェクトの ​src/main/java​ フォルダーの ​org.mycompany.utils​ という名前の Java パッケージの一部として作成されていることが前提となっています。

package org.mycompany.utils;

import java.util.Random;

public class MyUtils {

	public static String appendRandom(String base) {
		return base + new Random().nextInt();
	}

}

次のいずれかの方法で DataWeave コードから ​appendRandom()​ メソッドをコールできます。

  • クラスをインポートして、メソッドを参照する:

%dw 2.0
import java!org::mycompany::utils::MyUtils
output application/json
---
{
	a: MyUtils::appendRandom("myString")
}
  • クラス全体ではなく 1 つ以上のメソッドをインポートする:

%dw 2.0
import java!org::mycompany::utils::MyUtils::appendRandom
output application/json
---
{
	a: appendRandom("myString")
}
  • メソッドが静的メソッドの場合、1 行でインポートしてコールする:

%dw 2.0
output application/json
---
{
	a: java!org::mycompany::utils::MyUtils::appendRandom(vars.myString)
}

3 つのすべての方法で、ランダムな文字列が追加された変数値が返されます。

{
  "a":"myString969858409"
}

Java クラスのインスタンス化

DataWeave コードで、任意のクラスの新しいオブジェクトをインスタンス化できます。インスタンスを作成したら、DataWeave でそのインスタンスメソッドをコールできなくなります。ただし、その変数を参照することはできます。

この簡単な Java クラスにはメソッドと変数があります。

package org.mycompany.utils;
public class MyClass {

	private String foo;
	 public MyClass(String foo) {
		 this.foo = foo;
	}

	 public String getFoo() {
		return foo;
	}

}

Studio プロジェクトで ​MyClass​ サンプルを作成する手順は、次のとおりです。

  1. Studio でクラスのプロジェクトを作成します。これを行うには、​[New (新規)]​ → ​[Mule Project (Mule プロジェクト)]​ をクリックし、​my-app​ などの名前を付けて ​[Finish (完了)]​ をクリックします。

  2. my-app​ から ​org.mycompany.utils​ パッケージを作成します。これを行うには、Studio の ​Package Explorer​ から ​src/main/java​ を右クリックして、​[New (新規)]​ → ​[Package (パッケージ)]​ を選択し、パッケージに ​org.mycompany.utils​ という名前を付けます。

  3. 新しい ​org.mycompany.utils​ パッケージで ​MyClass​ クラスを作成します。これを行うには、​org.mycompany.utils​ を右クリックして、​[New (新規)]​ → ​[Class (クラス)]​ を選択し、クラスに ​MyClass​ という名前を付けて ​[Finish (完了)]​ をクリックします。

  4. Studio で開いている ​[MyClass.java]​ タブで、コンテンツ ​MyClass​ をコピーして貼り付け、保存します。

次の DataWeave の例では、​MyClass​ をインポートし、クラスの新しいインスタンスを作成して、そのインスタンス変数 ​foo​ をコールします。DataWeave からオブジェクトの非公開 ​getFoo()​ メソッドをコールすることはできません。

%dw 2.0
import java!org::mycompany::utils::MyClass
output application/json
---
{
	a: MyClass::new("myString").foo
}

この DataWeave の例を Studio プロジェクトに追加する手順は、次のとおりです。

  1. src/main/mule​ の ​my-app.xml​ に戻り、Transform Message コンポーネントをプロジェクトのキャンバスにドラッグし、クリックして開きます。

  2. コンポーネントの ​[Transform Message]​ タブで、ソースコード領域 (右側) のスクリプト全体を DataWeave スクリプト (上記) に置き換えます。

  3. 変更内容を保存し、​[Preview (プレビュー)]​ (タブの右端にある) をクリックして、次の出力を表示します。

{
  "a":"myString"
}

Mule フローの Transform Message の設定の XML は、次のようになります。

<flow name="my-appFlow" >
	<ee:transform doc:name="Transform Message" >
		<ee:message >
			<ee:set-payload ><![CDATA[%dw 2.0
import java!org::mycompany::utils::MyClass
output application/json
---
{
a: MyClass::new("myString").foo
}]]></ee:set-payload>
		</ee:message>
	</ee:transform>
</flow>

Java ブリッジの使用

DataWeave では、Java ブリッジを使用して Java の任意の静的関数やコンストラクターをコールできます。この機能は、Java で記述されたビジネスロジックを再利用する必要がある場合や、空の公開コンストラクターがない Java オブジェクトをインスタンス化する必要がある場合に役立ちます。

Java ブリッジを使用するには、完全修飾された Java 名を DataWeave 名に変換します。

  1. プレフィックス ​!java​ を追加します。

  2. 完全修飾名のドットを ​::​ に置き換えます。

Java 関数を呼び出すときには、DataWeave は各引数を関数パラメーターで想定される型に変換します。

次の例は、​java.lang.NullPointerException​ の新しいインスタンスを作成する方法を示しています。

%dw 2.0
output application/json
---
java!java::lang::NullPointerException::new("foo")

次の例では、関数 ​java.lang.String.valueOf​ を呼び出しています。

%dw 2.0
output text/plain
import valueOf from java!java::lang::String
---
valueOf(true)