«Объединить две полезные нагрузки в одну в компоненте преобразования» - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь добавить две полезные нагрузки json в одну, но получаю ошибку. Я использую Scatter Collection, где я получаю несколько полезных данных и объединяю полезные данные в сообщения преобразования. Ошибка: исключение при выполнении: полезная нагрузка [0] map (bookListing) -> using (id = bookListing.bookId) { Несоответствие типов для оператора 'map' найдено: строка,: функция требуется: массив,: функция.

код:

      <http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>
<file:connector name="file-connector-config" autoDelete="false" streaming="true" validateConnections="true" doc:name="File" />
<flow name="muleRequester">
    <http:listener config-ref="HTTP_Listener_Configuration" path="/requester" doc:name="HTTP"/>
    <scatter-gather doc:name="Scatter-Gather">
        <processor-chain>
            <mulerequester:request resource="file://src/main/resources/input1" returnClass="java.lang.String" doc:name="Retrieve File1"/>
            <logger message="#[payload]" level="INFO" doc:name="Logger"/>
        </processor-chain>
        <processor-chain>
            <mulerequester:request resource="file://src/main/resources/input2" returnClass="java.lang.String" doc:name="Retrieve File2"/>
            <logger message="#[payload]" level="INFO" doc:name="Logger"/>
        </processor-chain>
    </scatter-gather>
    <dw:transform-message doc:name="Transform Message">
        <dw:set-payload><![CDATA[%dw 1.0
         %output application/json
         ---
         payload[0]  map (bookListing) -> using (id = bookListing.bookId) {
bookId: id,
title:  bookListing.title,
price:  bookListing.price,
(payload[1] filter ($.*bookId contains id)  map (bookAuthor) -> {
    author:bookAuthor.author
        })
    }]]></dw:set-payload>
     </dw:transform-message>
     <file:outbound-endpoint responseTimeout="10000" doc:name="File" outputPattern="#[function:systime].json" path="src/main/resources/output"/>
    <logger message="#[payload]" level="INFO" doc:name="Logger"/>
</flow>

полезная нагрузка 1 - [ { "BookID": "101", "title": "всемирная история", «Цена»: «19,99» }, { "BookID": "202", "title": "на свежем воздухе", «Цена»: «15,99» } ]

полезная нагрузка 2- [ { "BookID": "101", "автор": "Джон Доу" }, { "BookID": "202", "автор": "джейн доу" } ]

Ожидаемый результат-

[ { "bookId": "101", "title": "всемирная история", "год": "2017", "isbn": "11111", «цена»: «19,99», "автор": "Джон Доу" }, { "bookId": "202", "title": "на свежем воздухе", "год": "2016", "isbn": "22222", «цена»: «15,99», "автор": "джейн доу" } ]

1 Ответ

1 голос
/ 13 мая 2019

Значения, возвращаемые из файлов, являются просто строковыми, поэтому необходимо сначала прочитать их во что-то, что может использоваться dataweave.Используйте функцию чтения следующим образом:

read(payload[0], 'application/json')

и

read(payload[1], 'application/json')

Вот полный пример.(Я разбил образец json в разбросе):

    <scatter-gather doc:name="Scatter-Gather">
       <set-payload value="[ { &quot;bookId&quot;:&quot;101&quot;, &quot;title&quot;:&quot;world history&quot;, &quot;price&quot;:&quot;19.99&quot; }, { &quot;bookId&quot;:&quot;202&quot;, &quot;title&quot;:&quot;the great outdoors&quot;, &quot;price&quot;:&quot;15.99&quot; } ]" doc:name="payload1"/>
       <set-payload value="[ { &quot;bookId&quot;:&quot;101&quot;, &quot;author&quot;:&quot;john doe&quot; }, { &quot;bookId&quot;:&quot;202&quot;, &quot;author&quot;:&quot;jane doe&quot; } ]" doc:name="payload2"/>
    </scatter-gather>

    <dw:transform-message doc:name="Transform Message">
       <dw:set-payload><![CDATA[%dw 1.0
%output application/json
---
read(payload[0], 'application/json')  map (bookListing) -> using (id = bookListing.bookId) {
bookId: id,
title:  bookListing.title,
price:  bookListing.price,
(read(payload[1], 'application/json') filter ($.*bookId contains id)  map (bookAuthor) -> {
    author:bookAuthor.author
})
}]]></dw:set-payload>
   </dw:transform-message>

Или вы можете прочитать все это в Json перед раздачей

...