错误无法使用 Mulesoft 将数组强制转换为对象
Error cannot coerce array to object using Mulesoft
我正在尝试使用 Mulesoft 的 Anypoint 平台将数据从一个数据库迁移到另一个数据库。为此,我从第一个数据库中选择所有数据并将其传递给一个存储过程,然后将其插入到第二个数据库中。
我正在发送负载,它是一个包含 table 数据的数组,我想一次插入每一行,但是,我收到此错误:
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>
有人知道如何解决这个问题吗?
谢谢!
编辑:我在存储过程组件之前添加了一个包含此内容的转换消息。
%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'
}
我的流程是这样的:
</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>
看起来payload.LOG_EVENT是一个数组。消息说数组不能强制对象。除了 LOG_EVENT 之外的所有变量都是常规变量,这意味着 LOG_EVENT 是数组。
尝试记录它并查看它是什么。
只是重复我的评论。但这是因为在批处理聚合步骤中转换消息之后,您有一个 java 对象的 arrayList。您的存储过程需要 1 个记录对象,因此您要么需要将 SP 调用包装在 for-each
范围内,要么不使用聚合步骤,以便您可以分别映射每条记录并进行 SP 调用。
我正在尝试使用 Mulesoft 的 Anypoint 平台将数据从一个数据库迁移到另一个数据库。为此,我从第一个数据库中选择所有数据并将其传递给一个存储过程,然后将其插入到第二个数据库中。 我正在发送负载,它是一个包含 table 数据的数组,我想一次插入每一行,但是,我收到此错误:
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>
有人知道如何解决这个问题吗? 谢谢!
编辑:我在存储过程组件之前添加了一个包含此内容的转换消息。
%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'
}
我的流程是这样的:
</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>
看起来payload.LOG_EVENT是一个数组。消息说数组不能强制对象。除了 LOG_EVENT 之外的所有变量都是常规变量,这意味着 LOG_EVENT 是数组。
尝试记录它并查看它是什么。
只是重复我的评论。但这是因为在批处理聚合步骤中转换消息之后,您有一个 java 对象的 arrayList。您的存储过程需要 1 个记录对象,因此您要么需要将 SP 调用包装在 for-each
范围内,要么不使用聚合步骤,以便您可以分别映射每条记录并进行 SP 调用。