Search code examples
sqlsql-serverxmldataweavemulesoft

Error cannot coerce array to object using Mulesoft


I'm trying to migrate data from one Database to another using Mulesoft's Anypoint Platform. To do that I'm selecting all the data from the first DB and passing it to a stored procedure that inserts it into the second one. I'm sending the payload, which is an array with the table's data, and I want to insert each row at a time, however, i'm getting this error:

Message               : "Cannot coerce Array ([]) to Object
Trace:
  at main (Unknown)" evaluating expression: "output application/java
---
payload map(payload,indexOfPayload ) -> {
"LOG_CODE": payload.LOG_CODE,
"USER_CODE": payload.USER_CODE,
"LOG_DATE": payload.LOG_DATE,
"LOG_USER_ID": payload.LOG_USER_ID,
"LOG_EVENT": payload.LOG_EVENT,
"LOG_USER_EMAIL": payload.LOG_USER_EMAIL
}".
Error type            : MULE:EXPRESSION
Element               : Copy_of_LOG_TLOGMigrationFlow/processors/1/route/0/route/0/aggregator/processors/0 @ DatabaseConnectorPOC:businessLogic.xml:54 (Copy_of_Stored procedure)
Element XML           : 
 <db:stored-procedure doc:name="Copy_of_Stored procedure" doc:id="59c14834-c745-4aba-9acf-a1b3f9577aed" config-ref="Database_Config">
<db:sql>{call InsertIntoContent (:LOG_CODE, :USER_CODE, :LOG_EVENT, :LOG_USER_ID, :LOG_USER_EMAIL, :LOG_DATE)}</db:sql>
<db:input-parameters>#[output application/java
---
payload map(payload,indexOfPayload ) -> {
    "LOG_CODE": payload.LOG_CODE,
    "USER_CODE": payload.USER_CODE,
    "LOG_DATE": payload.LOG_DATE,
    "LOG_USER_ID": payload.LOG_USER_ID,
    "LOG_EVENT": payload.LOG_EVENT,
    "LOG_USER_EMAIL": payload.LOG_USER_EMAIL
}]</db:input-parameters>
</db:stored-procedure>

Does anybody know how to fix this? Thank you!

Edit: I added a Transform Message with this content before Stored Procedure component.

%dw 2.0
output application/java
---
payload map(payload,indexOfPayload ) -> {
    LOG_CODE: 1,
    USER_CODE: 2,
    LOG_DATE: '5/1/2008 8:06:32 AM -07:00' as LocalDateTime {format: "yyyy-MM-dd'T'HH:mm:ss.SSS"},
    LOG_USER_ID: 'AAA',
    LOG_EVENT: 'AAA',
    LOG_USER_EMAIL: 'AAA'
}

This is what my flow looks like:

</flow>
    <flow name="Copy_of_LOG_TLOGMigrationFlow" doc:id="1597fca5-5e9b-45f6-9c49-b8f9ee50c663" >
        <db:select doc:name="Copy_of_Select LOG_TLOG from Oracle DB" doc:id="d6ca57de-230c-4d7e-b011-10ba3cbb103d" config-ref="MYCAREER_DEV_DB" >
            <db:sql >SELECT * FROM LOG_TLOG</db:sql>
        </db:select>
        <batch:job jobName="Copy_of_MigrateLOG_TLOGBatchJob" doc:id="0220ea42-8f72-4be5-813f-df48a772cf0b" >
            <batch:process-records >
                <batch:step name="Copy_of_MigrateLOG_TLOGBatchStep" doc:id="9bddfc72-07e3-4869-b9ad-26c89d945fe3" >
                    <batch:aggregator doc:name="Copy_of_LOG_TLOG Batch Aggregator" doc:id="47d150b2-e916-4f91-920c-9b46ec4de613" size="20" >
                        <ee:transform doc:name="Copy_of_Map LOG_TLOG from Oracle DB to fields of SQL Server DB" doc:id="4776778d-b98b-413e-a941-9f551a1efce8">
                            <ee:message>
                                <ee:set-payload><![CDATA[%dw 2.0
output application/java
---
payload map(payload,indexOfPayload ) -> {
    LOG_CODE: 1,
    USER_CODE: 2,
    LOG_DATE: '5/1/2008 8:06:32 AM -07:00' as LocalDateTime {format: "yyyy-MM-dd'T'HH:mm:ss.SSS"},
    LOG_USER_ID: 'AAA',
    LOG_EVENT: 'AAA',
    LOG_USER_EMAIL: 'AAA'
}]]></ee:set-payload>
                            </ee:message>
                        </ee:transform>
                        <db:stored-procedure doc:name="Copy_of_Stored procedure" doc:id="59c14834-c745-4aba-9acf-a1b3f9577aed" config-ref="Database_Config">
                            <db:sql>{call InsertIntoContent (:LOG_CODE, :USER_CODE, :LOG_EVENT, :LOG_USER_ID, :LOG_USER_EMAIL, :LOG_DATE)}</db:sql>
                            <db:input-parameters ><![CDATA[#[output application/java
---
 {
    "LOG_CODE": payload.LOG_CODE,
    "USER_CODE": payload.USER_CODE,
    "LOG_DATE": payload.LOG_DATE,
    "LOG_USER_ID": payload.LOG_USER_ID,
    "LOG_EVENT": payload.LOG_EVENT,
    "LOG_USER_EMAIL": payload.LOG_USER_EMAIL
}]]]></db:input-parameters>
                        </db:stored-procedure>
                    </batch:aggregator>
                </batch:step>
            </batch:process-records>
            <batch:on-complete >
                <logger level="INFO" doc:name="Copy_of_Logger" doc:id="8b5512f4-9925-4034-99d1-98f82bd34d06" message="LOG_TLOG finished data migration." />
            </batch:on-complete>
        </batch:job>
    </flow>

</mule>

Solution

  • Just re-iterating from my comment. But this is occurring because after your transform message in your batch aggregate step, you have an arrayList of java objects. Your stored procedure is expecting 1 record object, so you either need to wrap your SP call in a for-each scope or don't use an aggregate step so you can map each record separately and make your SP call.