错误无法使用 Mulesoft 将数组强制转换为对象

Posted

技术标签:

【中文标题】错误无法使用 Mulesoft 将数组强制转换为对象【英文标题】:Error cannot coerce array to object using Mulesoft 【发布时间】:2020-04-06 12:11:25 【问题描述】:

我正在尝试使用 Mulesoft 的 Anypoint 平台将数据从一个数据库迁移到另一个数据库。为此,我从第一个数据库中选择所有数据并将其传递给存储过程,该存储过程将其插入第二个数据库。 我正在发送有效负载,它是一个包含表数据的数组,我想一次插入每一行,但是,我收到了这个错误:

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>

【问题讨论】:

它的类型不匹配 @ooz;您的表达式的一部分需要Array,但您得到的是Object。我说将 DW 表达式外推到 Transform Message 处理器中设置几个样本数据,然后查看预览输出的内容。如果您提供示例数据和代码,我们应该能够为您修复它。 感谢您的回答!我按照您的建议将消息​​处理器组件添加到带有示例数据的流中,但它给了我同样的错误。 从您的流程来看,您似乎正在尝试对列表中的 20 条记录运行存储过程。我会尝试在您的存储过程调用周围包装一个 for-each 范围,该范围为集合中的每个记录调用它 似乎修复了它!十分感谢你的帮助! :D 【参考方案1】:

只是重复我的评论。但这是因为在批处理聚合步骤中的转换消息之后,您有一个 java 对象的 arrayList。您的存储过程需要 1 个记录对象,因此您需要将您的 SP 调用包装在 for-each 范围内,或者不使用聚合步骤,以便您可以分别映射每条记录并进行 SP 调用。

【讨论】:

我将存储过程包裹在一个 for-each 范围内,它解决了它!谢谢你的回答! :)【参考方案2】:

看起来 payload.LOG_EVENT 是一个数组。消息说数组不能用对象强制。除 LOG_EVENT 之外的所有变量都是常规变量,这意味着 LOG_EVENT 是数组。

尝试记录它,看看它是什么。

【讨论】:

将存储过程包装在 for-each 范围内修复了它!但是谢谢你的回答:)

以上是关于错误无法使用 Mulesoft 将数组强制转换为对象的主要内容,如果未能解决你的问题,请参考以下文章

如何将 c# 数组转换为 JSON,其中一个数组项属性值设置为对另一个项的引用

无法将 HttpContext 强制转换为用户

Mulesoft - 无法在数据库中侦听(MySQL 连接)

TypeError:错误#1034:类型强制失败:无法将Object @ 1456c7b9转换为mx.messaging.messages.IMessage

C#如何将OBJECT转换成数组

r 闪亮错误 as.vector(x, "character") 中的错误:无法将类型“闭包”强制转换为“字符”类型的向量