MuleSoft

Erori DataWeave in MuleSoft: Probleme frecvente si cum le rezolvi

Petru Constantin
--7 min lectura
#mulesoft#dataweave#troubleshooting#transformation#data-integration

DataWeave e puternic, dar produce erori criptice. Acest ghid decodifica cele mai frecvente erori DataWeave si ofera solutii testate.

Eroare: Cannot Coerce :null to :object

Simptom:

Cannot coerce Null (null) to Object
org.mule.weave.v2.exception.MuleWeaveException: Cannot coerce Null (null) to Object

Cauza: Accesezi proprietati pe o valoare null sau un payload null.

Solutia 1 - Navigare null-safe:

%dw 2.0
output application/json
---
// ❌ Esueaza daca payload-ul e null
{
    name: payload.customer.name
}
 
// ✅ Null-safe cu valoare default
{
    name: payload.customer.name default "Unknown"
}
 
// ✅ Lant complet null-safe
{
    name: (payload.customer default {}).name default "Unknown"
}
 
// ✅ Folosind unless-otherwise
{
    name: payload.customer.name unless payload.customer == null otherwise "Unknown"
}

Solutia 2 - Verificare conditionala:

%dw 2.0
output application/json
---
if (payload != null and payload.customer != null)
    { name: payload.customer.name }
else
    { name: "N/A" }

Eroare: Cannot Coerce :string to :number

Simptom:

Cannot coerce String "abc" to Number
You called the function '+' with these arguments: String, Number

Cauza: Operatii numerice pe valori de tip string.

Solutie - Conversie explicita de tip:

%dw 2.0
output application/json
---
{
    // ❌ Esueaza daca quantity e string "10"
    total: payload.quantity * payload.price,
 
    // ✅ Converteste la number mai intai
    total: (payload.quantity as Number default 0) * (payload.price as Number default 0),
 
    // ✅ Cu validare
    total: if (payload.quantity is Number and payload.price is Number)
               payload.quantity * payload.price
           else
               0
}

Functie de conversie numerica sigura:

%dw 2.0
output application/json
 
fun safeNumber(value) =
    if (value is Number) value
    else if (value is String and value matches /^-?\d+\.?\d*$/)
        value as Number
    else 0
---
{
    amount: safeNumber(payload.amount)
}

Eroare: Unable to Parse JSON/XML

Simptom:

Unable to read JSON at 1:1
Exception while executing parse: Expected a json value
Unexpected character '<' at index 0

Cauza: Nepotrivire de content type sau date malformate.

Solutia 1 - Forteaza tipul MIME corect:

%dw 2.0
output application/json
---
// Cand payload-ul e string care contine JSON
read(payload, "application/json")
 
// Cand payload-ul e string care contine XML
read(payload, "application/xml")

Solutia 2 - Gestioneaza continut mixt:

%dw 2.0
output application/json
 
fun tryParseJson(content) =
    try(read(content, "application/json")) orElse null
 
fun tryParseXml(content) =
    try(read(content, "application/xml")) orElse null
---
{
    data: tryParseJson(payload) default tryParseXml(payload) default payload
}

Solutia 3 - Curata BOM si whitespace:

%dw 2.0
output application/json
---
// Elimina BOM si spatiile de la inceput/sfarsit
read(trim(payload replace /^\uFEFF/ with ""), "application/json")

Eroare: Scripting Error - Heap Space

Simptom:

java.lang.OutOfMemoryError: Java heap space
org.mule.weave.v2.exception.MuleWeaveException: Max output size exceeded

Cauza: Procesarea de payload-uri mari sau transformari ineficiente.

Solutia 1 - Activeaza streaming:

%dw 2.0
output application/json deferred=true
---
payload map ((item) -> {
    id: item.id,
    name: item.name
})

Solutia 2 - Streaming in configuratia Mule:

<ee:transform doc:name="Transform">
    <ee:message>
        <ee:set-payload>
            <![CDATA[
                %dw 2.0
                output application/json streaming=true
                ---
                payload
            ]]>
        </ee:set-payload>
    </ee:message>
</ee:transform>

Solutia 3 - Pattern de procesare in batch-uri:

%dw 2.0
output application/json
 
var batchSize = 1000
var totalBatches = ceil(sizeOf(payload) / batchSize)
---
(1 to totalBatches) map ((batchNum) ->
    payload[(batchNum - 1) * batchSize to batchNum * batchSize - 1]
)

Eroare: Key Already Present

Simptom:

Duplicate key 'name' found at selector 'name'

Cauza: Obiectul are chei duplicate (frecvent la merge).

Solutie - Gestioneaza duplicatele explicit:

%dw 2.0
output application/json
 
// Merge obiecte, ultima valoare castiga
fun mergeObjects(obj1, obj2) =
    obj1 ++ obj2
 
// Merge cu rezolvare custom a conflictelor
fun mergeWithPriority(obj1, obj2) =
    (obj1 -- keysOf(obj2)) ++ obj2
---
{
    result: mergeWithPriority(payload.defaults, payload.overrides)
}

Eroare: Index Out of Bounds

Simptom:

Index 5 out of bounds for length 3
java.lang.ArrayIndexOutOfBoundsException

Cauza: Accesezi un index de array care nu exista.

Solutie - Acces sigur la array:

%dw 2.0
output application/json
---
{
    // ❌ Esueaza daca array-ul are mai putin de 3 elemente
    thirdItem: payload.items[2],
 
    // ✅ Acces sigur cu default
    thirdItem: payload.items[2] default null,
 
    // ✅ Verifica lungimea mai intai
    thirdItem: if (sizeOf(payload.items default []) > 2)
                   payload.items[2]
               else
                   null,
 
    // ✅ Acces sigur la primul/ultimul element
    firstItem: payload.items[0] default null,
    lastItem: payload.items[-1] default null
}

Eroare: Date Parsing Failed

Simptom:

Unable to parse '2025-13-45' as Date
Text '2025/01/15' could not be parsed at index 4

Cauza: Nepotrivire de format de data sau data invalida.

Solutie - Parsare flexibila de date:

%dw 2.0
output application/json
 
fun parseFlexibleDate(dateStr) =
    if (dateStr == null) null
    else if (dateStr matches /^\d{4}-\d{2}-\d{2}$/)
        dateStr as Date {format: "yyyy-MM-dd"}
    else if (dateStr matches /^\d{2}\/\d{2}\/\d{4}$/)
        dateStr as Date {format: "MM/dd/yyyy"}
    else if (dateStr matches /^\d{4}\/\d{2}\/\d{2}$/)
        dateStr as Date {format: "yyyy/MM/dd"}
    else
        try(dateStr as Date) orElse null
 
fun safeDateFormat(date, format) =
    if (date != null)
        date as String {format: format}
    else
        null
---
{
    parsedDate: parseFlexibleDate(payload.dateString),
    formatted: safeDateFormat(parseFlexibleDate(payload.dateString), "yyyy-MM-dd")
}

Eroare: Encoding Issues (UTF-8)

Simptom:

MalformedInputException: Input length = 1
Unmappable character for encoding UTF-8

Cauza: Caractere invalide sau encoding gresit.

Solutie - Forteaza encoding-ul:

%dw 2.0
output application/json encoding="UTF-8"
---
// Curata caracterele problematice
payload.text replace /[\x00-\x08\x0B\x0C\x0E-\x1F]/ with ""

In flow-ul Mule - seteaza encoding-ul:

<set-payload value="#[payload]" mimeType="application/json; charset=UTF-8"/>

Eroare: Maximum Call Stack Exceeded

Simptom:

Stack overflow
Maximum call stack size exceeded in recursive function

Cauza: Recursie infinita sau imbricare prea adanca.

Solutie - Tail recursion sau iteratie:

%dw 2.0
output application/json
 
// ❌ Recursie obisnuita (poate face overflow)
fun flattenBad(arr) =
    arr flatMap ((item) ->
        if (item is Array) flattenBad(item)
        else [item]
    )
 
// ✅ Foloseste flatten built-in cu limita de adancime
fun flattenSafe(arr, maxDepth = 10) =
    if (maxDepth <= 0) arr
    else flatten(arr map ((item) ->
        if (item is Array) flattenSafe(item, maxDepth - 1)
        else [item]
    ))
---
{
    flattened: flattenSafe(payload.nestedArray)
}

Tehnici de debugging DataWeave

Logheaza valori intermediare:

%dw 2.0
output application/json
import * from dw::Runtime
 
var step1 = payload.data
var logged1 = log("Step 1", step1)
var step2 = step1 filter ($.active == true)
var logged2 = log("Step 2", step2)
---
step2

Pattern try-catch:

%dw 2.0
output application/json
---
{
    result: try(() -> riskyOperation(payload))
        .success
        default "Operation failed",
 
    error: try(() -> riskyOperation(payload))
        .error.message
        default null
}

Inspectie de tip:

%dw 2.0
output application/json
---
{
    payloadType: typeOf(payload),
    isArray: payload is Array,
    isObject: payload is Object,
    keys: if (payload is Object) keysOf(payload) else null,
    size: sizeOf(payload default [])
}

Referinta rapida: Rezolvari frecvente

| Eroare | Rezolvare rapida | |--------|------------------| | Cannot coerce null | Adauga valoare default | | Cannot coerce string to number | Foloseste as Number default 0 | | Unable to parse JSON | Foloseste read(payload, "application/json") | | Heap space | Adauga streaming=true sau deferred=true | | Duplicate key | Foloseste -- pentru a sterge inainte de merge | | Index out of bounds | Foloseste [n] default null | | Date parse error | Foloseste pattern de format explicit | | Encoding error | Seteaza encoding="UTF-8" |

Transformari DataWeave complexe?

Stapanirea DataWeave necesita timp. Echipa noastra te poate ajuta cu:

  • Dezvoltare transformari complexe
  • Optimizare de performanta
  • Creare module custom
  • Migrare de la alte instrumente ETL

Obtine expertiza DataWeave


Sistemul tau AI e conform cu EU AI Act? Evaluare gratuita de risc - afla in 2 minute →

Ai nevoie de ajutor cu conformitatea EU AI Act sau securitatea AI?

Programeaza o consultatie gratuita de 30 de minute. Fara obligatii.

Programeaza un Apel

Weekly AI Security & Automation Digest

Get the latest on AI Security, workflow automation, secure integrations, and custom platform development delivered weekly.

No spam. Unsubscribe anytime.