Search code examples
esbdataweaveanypoint-studiomule4

Cannot coerce Array error while using map operator with XML data in mule 4?


I am getting the following error while using the map operator:

org.mule.runtime.core.internal.message.ErrorBuilder$ErrorImplementation
{
  description="Cannot coerce Array (org.mule.weave.v2.model.values.ArrayValue$IteratorArrayValue@22af825a) to String
Trace:
  at main (Unknown), while writing Xml

Payload:

%dw 2.0
output application/xml
ns cc someUrl
---
    (vars.products*product map {
        cc #productDetails: {
            cc #productCategory: $.productCategory,
            cc #productName: $.productName,
            cc #productImageData: $.productImageData
        }
    })

Products:

[
product:{productCategory= "A", productName="name", productImageData=base64 string},
product:{productCategory= "B", productName="name2", productImageData=base64 string},
product:{productCategory= "C", productName="name3", productImageData=base64 string}
]

Solution

  • There are no arrays in XML. I resolved that by using reduce() to concatenate the objects in the array. Also I added a root element, which is required in XML.

    For simplicity, I just added products as a variable inside the script:

    %dw 2.0
    output application/xml
    ns cc someUrl
    var products=[
    product:{productCategory: "A", productName:"name", productImageData:"base64 string"},
    product:{productCategory: "B", productName:"name2", productImageData:"base64 string"},
    product:{productCategory: "C", productName:"name3", productImageData:"base64 string"}
    ]
    
    ---
    result: ( products.*product map {
            cc #productDetails: {
                cc #productCategory: $.productCategory,
                cc #productName: $.productName,
                cc #productImageData: $.productImageData
            }
        } ) reduce ((item, accumulator={}) -> item ++ accumulator )
    

    Output:

    <?xml version='1.0' encoding='UTF-8'?>
    <result>
      <cc:productDetails xmlns:cc="someUrl">
        <cc:productCategory>C</cc:productCategory>
        <cc:productName>name3</cc:productName>
        <cc:productImageData>base64 string</cc:productImageData>
      </cc:productDetails>
      <cc:productDetails xmlns:cc="someUrl">
        <cc:productCategory>B</cc:productCategory>
        <cc:productName>name2</cc:productName>
        <cc:productImageData>base64 string</cc:productImageData>
      </cc:productDetails>
      <cc:productDetails xmlns:cc="someUrl">
        <cc:productCategory>A</cc:productCategory>
        <cc:productName>name</cc:productName>
        <cc:productImageData>base64 string</cc:productImageData>
      </cc:productDetails>
    </result>