DataWeave スクリプトが失敗した場合のトラブルシューティング

DataWeave 2.2 は Mule 4.2 と互換性があり、Mule 4.2 にバンドルされています。 このバージョンの Mule は、拡張サポートが終了する 2023 年 5 月 2 日にその すべてのサポート​が終了しました。

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

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

失敗したスクリプトをトラブルシューティングする場合、特に本番環境では入力の変化が予測できないため、エラーを再現するためにスクリプトの実行時と同じ入力を供給することは困難です。そのため、ロガーをデバッグまたは使用してスクリプトへの入力を取得することが重要です。多くの場合、失敗は別の上流コンポーネントからの入力が有効でないために発生します。ここでは、一般的な DataWeave エラーとその解決方法を示します。

入力コンテキストとスクリプトのフォルダーへのダンプ

Mule 4.2.1 では、スクリプトが失敗した原因となったデータに沿ってスクリプトを追跡できるように、入力コンテキストや失敗したスクリプトをフォルダーにダンプするための実験的な機能が DataWeave に導入されています。 間違ったスクリプトが失敗するのは上流コンポーネントが無効なデータを生成した場合が多いため、このツールは受信した入力データが有効であることを確認するために特に役立ちます。

この機能を使用する手順は、次のとおりです。

  1. ダンプ機能を有効にするには、次のシステムプロパティを設定します。

    -M-Dcom.mulesoft.dw.dump_files=true

  2. [省略可能] ダンプファイルを生成するパスを指定します。

    -M-Dcom.mulesoft.dw.dump_folder=<path_to_folder>

    デフォルトディレクトリは ​/tmp​ です。

DataWeave の例外

このツールは、多くの一般的な DataWeave 例外に対処するのに役立ちます。

間違った引数

間違った引数で関数を呼び出すと、​org.mule.weave.v2.exception.UnsupportedTypeCoercionException​ 例外がスローされます。 この例外の原因としては以下が考えられます。

関数が Null 引数を受け付けない

この例外が発生する最も一般的な原因は、いずれかの引数が ​Null​ で、関数が ​Null​ を引数として受け付けないことです。この問題が発生すると、次のようなエラーメッセージが返されます。

You called the function '++' with these arguments:
  1: Null (null)
  2: String (" A text")

But it expects one of these combinations:
  (Array, Array)
  (Date, Time)
  (Date, LocalTime)
  (Date, TimeZone)
  (LocalDateTime, TimeZone)
  (LocalTime, Date)
  (LocalTime, TimeZone)
  (Object, Object)
  (String, String)
  (Time, Date)
  (TimeZone, LocalDateTime)
  (TimeZone, Date)
  (TimeZone, LocalTime)

4| payload.message ++ " A text"
   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Trace:
  at main::++ (line: 4, column: 1)
  at main::main (line: 4, column: 17)

この問題を解決する方法の 1 つは、​default​ 演算子を使用することです。たとえば、​payload.message default "" ++ " A text"​ を使用すると、メッセージが Null である場合には空のテキストが付加されます。

MIME タイプ設定されていない

MIME タイプが設定されていない場合は、次のようなエラーメッセージが返されます。

You called the function 'Value Selector' with these arguments:
  1: String ("{\"message\": 123}")
  2: Name ("message")

But it expects one of these combinations:
  (Array, Name)
  (Array, String)
  (Date, Name)
  (DateTime, Name)
  (LocalDateTime, Name)
  (LocalTime, Name)
  (Object, Name)
  (Object, String)
  (Period, Name)
  (Time, Name)

4| payload.message
   ^^^^^^^^^^^^^^^
Trace:
  at main::main (line: 4, column: 1)

ペイロードで MIME タイプが設定されていない場合、MIME タイプはデフォルトで ​application/java​ に設定され、コンテンツは JSON オブジェクトではなく ​String​ として処理されます。

スタックのオーバーフロー

関数の再帰が深すぎると、次のようなエラーがスローされます。

Stack Overflow. Max stack is 256

最大スタックサイズは、プロパティ ​com.mulesoft.dw.stacksize​ を使用して設定できます。

出力が未定義の場合の不一致

変換とは異なり、DataWeave 式では出力形式を定義する必要がありません。これは、DataWeave は使用される式と変数に基づいて出力を推定できるためです。場合によっては、推定プロセスによって推定された型と期待される型の間に不一致が生じることがあります。この問題を解決するには、出力を明示する必要があります。この状況が発生する一般的な例として次のものがあります。

XML からのデータの抽出

文字列を抽出する場合 (XML ペイロードから式 ​payload.order.product.model​ を使用して抽出するなど)、DataWeave はペイロード形式に基づいて XML を推定します。このような場合、次のようなエラーが発生します。

"Trying to output non-whitespace characters outside main element tree (in prolog or epilog), while writing Xml at ." evaluating expression: "payload.order.product.model".

このようなエラーが発生する場合は、出力形式を明示する必要があります。たとえば、​output text/plain --- payload.order.product.model​ のようにします。

マルチパートエントリの処理

特定の構造を持つマルチパートデータでは、一般的な推定エラーが発生します。マルチパートペイロードと式 ​dw::core::Objects::keySet(payload.parts)​ について考えてみます。明示的な出力形式がなければ、DataWeave はペイロード種別に基づいて、マルチパートコンテンツを出力すると推定します。この場合、次のようなエラーがスローされます。

"Expecting type is {
  preamble?: String,
  parts: {
    _*: {
      headers: Object,
      content: Any
    }
  }
} but got Array, while writing MultiPart.
Trace:
  at main (Unknown)" evaluating expression: "dw::core::Objects::keySet(payload.parts)".

この問題を解決するには、出力形式を定義する必要があります。たとえば、​output application/json --- dw::core::Objects::keySet(payload.parts)​ のようにします。

テキストデータの操作

テキストデータを使用して、より複雑なオブジェクトを作成できます。ただし、入力テキストデータに対して出力形式を定義しないと、DataWeave は出力にプレーンテキストライターを使用すると推定します。たとえば、式 ​payload splitBy ' '​ は次のようなエラーで失敗します。

"Text plain writer is unable to write Array.
Reason:
Cannot coerce Array (org.mule.weave.v2.model.values.ArrayValue$ArraySeqArrayValue@21bec687) to String
Trace:
  at main (Unknown), while writing TextPlain.
Trace:
  at main (Unknown)" evaluating expression: "payload splitBy ' '".

出力を明示することで問題が解決します。たとえば、​output application/java --- payload splitBy ' '​ のようにします。