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)
---
step2Pattern 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
Sistemul tau AI e conform cu EU AI Act? Evaluare gratuita de risc - afla in 2 minute →