Flex Gateway新着情報
Governance新着情報
Monitoring API Manager失敗したスクリプトをトラブルシューティングする場合、特に本番環境では入力の変化が予測できないため、エラーを再現するためにスクリプトの実行時と同じ入力を供給することは困難です。そのため、ロガーをデバッグまたは使用してスクリプトへの入力を取得することが重要です。多くの場合、失敗は別の上流コンポーネントからの入力が有効でないために発生します。ここでは、一般的な 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) 1| payload.message ++ " A text" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Trace: at ++ (line: 1, column: 1) at main (line: 1, column: 17)
weave
この問題を解決する方法の 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) 1| payload.message ^^^^^^^^^^^^^^^ Trace: at main (line: 1, column: 1)
weave
ペイロードで MIME タイプが設定されていない場合、MIME タイプはデフォルトで
application/java
に設定され、コンテンツは JSON オブジェクトではなく String
として処理されます。
関数の再帰が深すぎると、次のようなエラーがスローされます。
Stack Overflow. Max stack is 256
weave
最大スタックサイズは、プロパティ com.mulesoft.dw.stacksize
を使用して設定できます。
ここでは、ダンプファイルに見られる一般的な DataWeave の警告と、これらの警告を解決するための詳細を説明します。
この警告は、DataWeave が Unicode 非文字 U+FFFF
を入力の最後を示す特殊文字として扱うために表示されます。
この警告を回避するには、未加工ペイロードの特殊文字を置き換えてから通常どおりに進めます。
read(payload.^raw replace "\uFFFF" with "NonChar")
weave
変換とは異なり、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".
weave
このようなエラーが発生する場合は、出力形式を明示する必要があります。たとえば、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)".
weave
この問題を解決するには、出力形式を定義する必要があります。たとえば、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@1331b353) to String Trace: at main (Unknown), while writing TextPlain. Trace: at main (Unknown)" evaluating expression: "payload splitBy ' '".
weave
出力を明示することで問題が解決します。たとえば、output application/java --- payload splitBy ' '
のようにします。