Выражение Mulesoft Dataweave вызывает ошибку - PullRequest
0 голосов
/ 11 июля 2020

Проверьте изображение для просмотра экрана mule4 Я использую mule4 для создания потока интеграции, выражение Dataweave для преобразования данных и почтальон для проверки HTTP-вызова, я пытаюсь получить 0011x000014VegoAA C из XML ниже в Dataweave и вставьте в запись Salesforce. Все работало нормально, пока я не добавил эти две строки (предполагается, что они извлекают 0011x000014VegoAA C из XML)

PBSI__Customer__c: (payload.ns0#order.ns0#"custom-attributes".*ns0#"custom-attribute") 
    filter (item) -> (item.@"attribute-id" == "sscAccountid") 

XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<order order-no="00000907" xmlns="http://www.demandware.com/xml/impex/order/2006-10-31">
    <order-date>2020-07-10T08:57:05.076Z</order-date>
    <current-order-no>00000907</current-order-no>
    <product-lineitems>
        <product-lineitem>
            <net-price>54.17</net-price>
        </product-lineitem>
    </product-lineitems>
    <custom-attributes>
        <custom-attribute attribute-id="Adyen_pspReference">852594371442812G</custom-attribute>
        <custom-attribute attribute-id="Adyen_value">7099</custom-attribute>
        <custom-attribute attribute-id="sscAccountid">0011x000014VegoAAC</custom-attribute>
    </custom-attributes>
</order>

Полный код Dataweave

 %dw 2.0
    output application/java
    ns ns0 http://www.demandware.com/xml/impex/order/2006-10-31
    ---
    [{  
        Ascent4Ecomm__Ecomm_Order_ID__c: payload.ns0#order.ns0#"original-order-no",
        Ascent4Ecomm__Ecomm_Order_Name__c: payload.ns0#order.ns0#"original-order-no",
        Ascent4Ecomm__Ecomm_Order_Number__c: payload.ns0#order.ns0#"original-order-no", 
        attributes: {
            "type": "PBSI__PBSI_Sales_Order__c",
            "referenceId": "SO"
        },
        PBSI__Sales_Order_Lines__r: {
            records: payload.ns0#order.ns0#"product-lineitems".*ns0#"product-lineitem" map ( e , empindex ) -> {
                "attributes": {
                    "type": "PBSI__PBSI_Sales_Order_Line__c",
                    "referenceId": e.ns0#"product-id"
                },
                "PBSI__Item__c": e.ns0#"custom-attributes".ns0#"custom-attribute",
                "PBSI__ItemDescription__c": e.ns0#"product-name"
            }
        },
***These two lines throws error:***
        PBSI__Customer__c: (payload.ns0#order.ns0#"custom-attributes".*ns0#"custom-attribute")
            filter (item) -> (item.@"attribute-id" == "sscAccountid")
    }]

ошибка

:Invalid status code: 400, response body: [{"message":"Cannot deserialize instance of reference from START_ARRAY value [line:1, column:423]","errorCode":"JSON_PARSER_ERROR"}]

Все работало нормально до этих двух строк [экран Mule4] [2]

Я использую почтальон для выполнения HTTP-вызова этого потока

1 Ответ

1 голос
/ 11 июля 2020

Это ошибка HTTP 400. Описание указывает на то, что какое-то приложение пытается проанализировать ввод JSON. Неясна связь с вашим преобразованием DataWeave, но оно выводит Java, а не JSON. Вероятно, вам нужно вместо этого изменить вывод на application / JSON.

UPDATE: на основе комментариев вы из PBSI__Customer __ c должны вернуть одну строку с некоторым идентификатором, которая возвращает список из Выражение DataWeave в вопросе, вам нужно получить первый элемент. Вы можете получить это с помощью селектора индекса [0], хотя я не знаю, гарантировано ли, что полезная нагрузка всегда будет содержать один элемент.

PBSI__Customer__c: ((payload.ns0#order.ns0#"custom-attributes".*ns0#"custom-attribute")
        filter (item) -> (item.@"attribute-id" == "sscAccountid")) [0]
...