Ошибка не может привести массив к объекту, используя Mulesoft - PullRequest
1 голос
/ 06 апреля 2020

Я пытаюсь перенести данные из одной базы данных в другую, используя платформу 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>

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Просто повторюсь из моего комментария. Но это происходит потому, что после вашего сообщения преобразования на шаге агрегирования пакетов у вас есть arrayList из java объектов. Ваша хранимая процедура ожидает 1 объект записи, поэтому вам нужно либо обернуть ваш вызов SP в область действия for-each, либо не использовать сводный шаг, чтобы вы могли отобразить каждую запись отдельно и выполнить свой вызов SP.

0 голосов
/ 06 апреля 2020

Похоже, что payload.LOG_EVENT - это массив. Сообщение говорит, что массив не может взаимодействовать с объектом. Все переменные, кроме LOG_EVENT, являются обычными, что означает, что это LOG_EVENT, который является массивом.

Попробуйте зарегистрировать его и посмотреть, что это такое.

...