WSO2 EI Для цикла через массив Json - PullRequest
0 голосов
/ 08 июля 2019

У меня есть запрос ниже (я использую WSO2 Enterprise интегратор 6.5.0):

И я хочу получить это в jsonpayload, которое возвращается клиенту

<ERROR_RESP>
    <ERROR>
        <ECODE>ST-VALS-002</ECODE>
        <EDESC>Record Not Found  for Branch Code-CHO:Currency 1-USD:Currency 2-MN</EDESC>
    </ERROR>
    <ERROR>
        <ECODE>ST-SAVE-024</ECODE>
        <EDESC>Failed to Query Data</EDESC>
    </ERROR>
</ERROR_RESP>

Это мой проверенный код для достижения этой цели:

<foreach expression="json-eval($.ERROR_RESP.ERROR)">
    <sequence>
        <payloadFactory media-type="json">
            <format>
            { 
                "ErrorCode" : "$1", 
                "ErrorMessage" : "$2"  
            }
                </format>
            <args>
                <arg evaluator="json" expression="$.ECODE"/>
                <arg evaluator="json" expression="$.EDESC"/>
            </args>
        </payloadFactory>
        <log level="full">
            <property name="MESSAGE" value="ENDLOOP"/>
        </log>
        <loopback/>
    </sequence>
</foreach> 
enter code here

Я провел некоторый поиск, но ничего не сработало, я думаю foreach выражение не правильно.

Спасибо

С уважением,

Ответы [ 2 ]

3 голосов
/ 08 июля 2019

В вашем примере используется медиатор Loopback.Он будет использоваться для перемещения сообщения в выходной поток (путь ответа).Поэтому посредник Foreach разделяет сообщение и отправляет первое сообщение в путь ответа и завершает поток.

Вы можете подготовить полезную нагрузку XML и преобразовать ее в JSON, используя свойство messageType с областью видимости axis2, следующим образом.

    <foreach expression="//ERROR">
        <sequence>
           <payloadFactory media-type="xml">
              <format>
                 <ERROR xmlns="">
                    <ErrorCode>$1</ErrorCode>
                    <ErrorMessage>$2</ErrorMessage>
                 </ERROR>
              </format>
              <args>
                 <arg evaluator="xml" expression="//ECODE/text()"/>
                 <arg evaluator="xml" expression="//EDESC/text()"/>
              </args>
           </payloadFactory>
        </sequence>
     </foreach>
     <property name="messageType" scope="axis2" value="application/json"/>

Последнее сообщение будет выглядеть так:

{
    "ERROR_RESP": {
        "ERROR": [
            {
                "ErrorCode": "ST-VALS-002",
                "ErrorMessage": "Record Not Found  for Branch Code-CHO:Currency 1-USD:Currency 2-MN"
            },
            {
                "ErrorCode": "ST-SAVE-024",
                "ErrorMessage": "Failed to Query Data"
            }
        ]
    }
}
2 голосов
/ 08 июля 2019

В настоящее время посредник foreach в EI 6.5.0 не поддерживает выражения "json-eval ()". Эта функция будет включена в следующие версии.

В качестве обходного пути вы можете использовать XPath внутри выражения. Вы можете использовать этот блог в качестве примера. https://medium.com/@Manuri/wso2-esb-foreach-mediator-example-87f041e2a912

...