MEL から DataWeave への移行

Mule 4.1 の標準サポートは 2020 年 11 月 2 日に終了しました。このバージョンの Mule は、拡張サポートが終了する 2022 年 11 月 2 日にその すべてのサポート​が終了しました。

このバージョンの Mule を使用する CloudHub には新しいアプリケーションをデプロイできなくなります。許可されるのはアプリケーションへのインプレース更新のみになります。

標準サポートが適用されている最新バージョンの Mule 4 にアップグレード​することをお勧めします。これにより、最新の修正とセキュリティ機能強化を備えたアプリケーションが実行されます。

Mule 4 では Mule Expression Language (MEL) が DataWeave 式言語に要素に置き換わりました。 このセクションでは、Mule アプリケーションの MEL 式を DataWeave (2.0 以降) に移行するための指針を提供します。

DataWeave の概要

DataWeave は、単に値の参照と条件の評価を行う式言語として、または関数や再帰を含む複雑なデータ変換を作成するスクリプティング言語として使用できる Mule 固有の言語です。

MEL とは違い、JSON、XML、CSV など、さまざまなデータ型が標準でサポートされます。つまり、式を評価する前にデータを変更する必要がなくなりました。 また、関数のマッピングやデータの絞り込みなど、高度なユースケースもサポートされています。

DataWeave のメインデータセレクタは ​.​ 演算子であることに留意してください。 ほとんどキーワードは MEL と共有されるので、ほとんどのシナリオの構文は同じになります。たとえば、​#[message.payload.name]​ は両言語とも同じです。

MEL と DataWeave の主な違いは、DataWeave 式には副作用がないことです。DataWeave を使用してデータを抽出または生成できますが、データを変更することはできません。 それらのユースケースの対処法については、​Java インテグレーション​の例を参照してください。

MEL の使用法

以下のセクションでは、MEL の一部の使用法を Mule 4 に適応させる方法を説明します。

コンテキスト変数へのアクセス

次の変更を除き、DataWeave では​コンテキスト変数​ (Mule Runtime 変数とも呼ばれる) は同じままです。

MEL DataWeave

フロー変数

flowVars

  • 例: #[flowVars.myVar]

Mule イベント変数

vars

  • 例: #[vars.myVar]

例外

exception

Mule エラー​: error

インバウンド添付ファイル

message.inboundAttachments

マルチパートデータ形式

情報:

インバウンドプロパティ

message.inboundProperties

  • 例:

#[inboundProperties.'http.query.params']
#[inboundProperties]

Mule メッセージ属性​ (メタデータ)

attributes

  • 例:

#[attributes.queryParams]
#[attributes.headers]

アウトバウンド添付ファイル

message.outboundAttachments

マルチパートデータ形式

情報:

アウトバウンドプロパティ

message.outboundProperties

削除:

情報:

message.dataType

dataType

message.id​、​message.rootId​、​message.replyTo

削除

レコード変数

recordVars

  • 例: #[recordVars.myVar]

Mule イベント変数

vars

  • 例: #[vars.myVar]

セッション変数

sessionVars

  • 例: #[sessionVars.myVar]

削除:

トランスポートバリアは Mule 4 には存在しません。情報:

server.dateTime

削除:

DataWeave ​now​ 関数を使用する。

データの抽出

DataWeave セレクタ​を使用して、MEL と同様にデータを照会できます。また、JSON などの型に対応するために、さらに変換を行う必要がありません。

以下の例では、次の JSON ペイロードの ID をログに記録します。

JSON ペイロード
{
  "name" : "Rachel Duncan",
  "id": "779H41"
}
Mule 3 の例
<json:json-to-object-transformer returnClass="java.util.Map" />
<logger message="Updating health check record for subject '#[payload.id]'" level="INFO" />
Mule 4 の例
<logger message="Updating health check record for subject '#[payload.id]'" />

値の割り当て

前述のとおり、DataWeave では、MEL の ​expression-component​ で許可されていたようなデータの変更はサポートされていません。そのようなユースケースを実行するには、スクリプティングモジュールを使用する必要があります。

Java マップとして記述されている​前述​のペイロードを考えてみます。例では、​name​ 属性を変更します。

Mule 3 の例
<expression-component>
  <![CDATA[
    payload.name = 'R. Duncan'
  ]]>
</expression-component>
Mule 4 の例
<script:execute engine="groovy">
  <script:code>
    payload.put('name', 'R. Duncan')
    return payload
  </script:code>
</script:execute>

スクリプティングモジュールを使用するには、Studio のパレットを使用してアプリケーションに追加するか、​pom.xml​ ファイルで次の連動関係を追加します。

<dependency>
  <groupId>org.mule.modules</groupId>
  <artifactId>mule-scripting-module</artifactId>
  <version>1.1.0</version> <!-- or newer -->
  <classifier>mule-plugin</classifier>
</dependency>

Java メソッドの呼び出し

DataWeave を使用して静的メソッドを呼び出すことができます。通常のメソッドの場合は Java Module を使用できます。このモジュールは操作と関数の両方を公開して Java メソッドを呼び出します。

静的メソッド

以下の例では、Java の Locale ​getDefault​ 静的メソッドを Mule 3 と Mule 4 で使用しています。

Mule 3 の例
<validation:is-time time="#[payload]" pattern="h:mm a" locale="#[java.util.Locale.getDefault().getLanguage()]"/>
Mule 4 の例
<validation:is-time time="#[payload]" pattern="h:mm a" locale="#[java!java::util::Locale::getDefault().getLanguage()]"/>

DataWeave では、Java 静的メソッドが検索対象であることを示す ​java!​ プレフィックスと、完全修飾された (​.​ ではなく、​::​ 区切りの) クラス名が必要です。

インスタンスメソッド

以下の例は、Mule 3 と Mule 4 での Java の String ​equalsIgnoreCase​ メソッドの使用法を示しています。

Mule 3 の例
<choice>
  <when expression="#[payload.equalsIgnoreCase('error')]">
    <logger message="An error message has been received." level="ERROR"/>
  </when>
  <otherwise>
    <logger message="Message received: #[payload]" level="INFO"/>
  </otherwise>
</choice>
Mule 4 の例
<choice doc:name="Choice">
  <when expression="#[Java::invoke('java.lang.String', 'equalsIgnoreCase(String)', payload, {arg0: 'error'})]">
		<logger message="An error message has been received." level="ERROR"/>
	</when>
	<otherwise >
		<logger message="Message received: #[payload]" level="INFO"/>
	</otherwise>
</choice>

Java Module を使用するには、Studio のパレットを使用してアプリケーションに追加するか、​pom.xml​ ファイルで次の連動関係を追加します。

<dependency>
  <groupId>org.mule.modules</groupId>
  <artifactId>mule-java-module</artifactId>
  <version>1.0.0</version> <!-- or newer -->
  <classifier>mule-plugin</classifier>
</dependency>

対象の定義

enricher​ は削除されて、すべての操作でサポートされる対象変数に置き換わりました。以下の例は、Mule 3 と Mule 4 で操作の結果を変数に送信する方法を示しています。

Mule 3 の例
<enricher target="#[flowVars.response]">
    <http:request config-ref="HTTP_Request_Configuration" path="/get" method="GET"/>
</enricher>
Mule 4 の例
<http:request config-ref="HTTP_Request_Configuration" path="/get" method="GET" target="response"/>

XPath 関数

DataWeave では、​セレクタ​を使用して XML コンテンツを照会できますが、XML Module を使用することもできます。このモジュールは操作と関数の両方を公開して XPath クエリを実行します。

以下の例は、Mule 3 と 4 で、変数から取得された特定の単語を含む行を取得する方法を示しています。

Mule 3 の例
<set‐variable variableName="word" value="handkerchief"/>
<expression‐transformer>
   xpath3('//LINE[contains(.,$word)]',payload,'NODESET')
</expression‐transformer>
Mule 4 の例
<set‐variable variableName="word" value="handkerchief"/>
<set-payload value="#[XmlModule::xpath('//LINE[contains(., \$word)]', payload, {'word': vars.word})]" />

XML Module を使用するには、Studio のパレットを使用してアプリケーションに追加するか、​pom.xml​ ファイルで次の連動関係を追加します。

<dependency>
  <groupId>org.mule.modules</groupId>
  <artifactId>mule-xml-module</artifactId>
  <version>1.1.0</version> <!-- or newer -->
  <classifier>mule-plugin</classifier>
</dependency>

ワイルドカード関数と正規表現関数

DataWeave のマッチング関数 ​match​ と ​matches​ を代わりに使用できます (コア DataWeave 関数を参照してください)。次の例は、DataWeave で正規表現を使用して、​wildcard​ MEL 関数の使用を置き換える方法を示しています。

Mule 3 の例
<choice>
  <when expression="#[wildcard('Hello *')]">
    <set-payload value="Hello, how can I help?"/>
  </when>
  <otherwise>
    <set-payload value="Courtesy requires a greeting."/>
  </otherwise>
</choice>
Mule 4 の例
<choice doc:name="Choice">
  <when expression="#[payload matches /Hello\s[A-z]+/]">
    <set-payload value="Hello, how can I help?"/>
  </when>
  <otherwise >
    <set-payload value="Courtesy requires a greeting."/>
  </otherwise>
</choice>