Flex Gateway新着情報
Governance新着情報
Monitoring API Manager
DataWeave 2.2 は Mule 4.2 と互換性があり、Mule 4.2 にバンドルされています。 このバージョンの Mule は、拡張サポートが終了する 2023 年 5 月 2 日にその すべてのサポートが終了しました。 このバージョンの Mule を使用する CloudHub には新しいアプリケーションをデプロイできなくなります。許可されるのはアプリケーションへのインプレース更新のみになります。 標準サポートが適用されている最新バージョンの Mule 4 にアップグレードすることをお勧めします。これにより、最新の修正とセキュリティ機能強化を備えたアプリケーションが実行されます。 |
失敗したスクリプトをトラブルシューティングする場合、特に本番環境では入力の変化が予測できないため、エラーを再現するためにスクリプトの実行時と同じ入力を供給することは困難です。そのため、ロガーをデバッグまたは使用してスクリプトへの入力を取得することが重要です。多くの場合、失敗は別の上流コンポーネントからの入力が有効でないために発生します。ここでは、一般的な DataWeave エラーとその解決方法を示します。
Mule 4.2.1 では、スクリプトが失敗した原因となったデータに沿ってスクリプトを追跡できるように、入力コンテキストや失敗したスクリプトをフォルダーにダンプするための実験的な機能が DataWeave に導入されています。 間違ったスクリプトが失敗するのは上流コンポーネントが無効なデータを生成した場合が多いため、このツールは受信した入力データが有効であることを確認するために特に役立ちます。
この機能を使用する手順は、次のとおりです。
ダンプ機能を有効にするには、次のシステムプロパティを設定します。
-M-Dcom.mulesoft.dw.dump_files=true
[省略可能] ダンプファイルを生成するパスを指定します。
-M-Dcom.mulesoft.dw.dump_folder=<path_to_folder>
デフォルトディレクトリは /tmp
です。
このツールは、多くの一般的な DataWeave 例外に対処するのに役立ちます。
間違った引数で関数を呼び出すと、org.mule.weave.v2.exception.UnsupportedTypeCoercionException
例外がスローされます。
この例外の原因としては以下が考えられます。
この例外が発生する最も一般的な原因は、いずれかの引数が 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 タイプが設定されていない場合は、次のようなエラーメッセージが返されます。
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
として処理されます。
変換とは異なり、DataWeave 式では出力形式を定義する必要がありません。これは、DataWeave は使用される式と変数に基づいて出力を推定できるためです。場合によっては、推定プロセスによって推定された型と期待される型の間に不一致が生じることがあります。この問題を解決するには、出力を明示する必要があります。この状況が発生する一般的な例として次のものがあります。
文字列を抽出する場合 (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 ' '
のようにします。