2017-01-15 4 views
0

У меня есть полезная нагрузка Json и Json flowVars. Я наполнение массива продуктов в полезной нагрузке Магазинов Json с Продукты Json flowVar, но я вижу следующее сообщение об ошибке:Неожиданная ошибка символов при использовании нескольких входов Json в Dataweave

INFO 2017-01-15 23:06:32,559 [[test].test-httpListenerConfig.worker.01] org.mule.api.processor.LoggerMessageProcessor: **** Stores JSON Payload: {"storeId":"1234"} 
INFO 2017-01-15 23:06:32,574 [[test].test-httpListenerConfig.worker.01] org.mule.api.processor.LoggerMessageProcessor: *** Products JSON flowvar{"products": [{ "product": "phone", "price": "499.99" }]} 
ERROR 2017-01-15 23:06:34,489 [[test].test-httpListenerConfig.worker.01] org.mule.exception.DefaultMessagingExceptionStrategy: 
******************************************************************************** 
Message    : Exception while executing: 
{stores={storeId=1234}, products=[]} 
^ 
Unexpected character 's' at index 1 (line 1, position 2), expected '"'. 
Payload    : {"storeId":"1234"} 
Payload Type   : java.lang.String 
Element    : /getFlow/processors/3/3 @ test:testcsv.xml:22 (Transform Message) 
Element XML   : <dw:transform-message metadata:id="43b88f1f-032a-442f-94f7-09fbc853390b" doc:name="Transform Message"> 
         <dw:input-payload mimeType="application/json"></dw:input-payload> 
         <dw:input-variable mimeType="application/json" variableName="varTest"></dw:input-variable> 
         <dw:set-payload>%dw 1.0%input payload application/json%output application/json---{products: flowVars.varTest.products map ((product , indexOfProduct) -> {product: product.product,price: product.price})}</dw:set-payload> 
         </dw:transform-message> 
-------------------------------------------------------------------------------- 
Root Exception stack trace: 
com.mulesoft.weave.mule.exception.WeaveExecutionException: Exception while executing: 
{stores={storeId=1234}, products=[]} 
^ 
Unexpected character 's' at index 1 (line 1, position 2), expected '"'. 
    at com.mulesoft.weave.mule.exception.WeaveExecutionException$.apply(WeaveExecutionException.scala:12) 
    at com.mulesoft.weave.mule.WeaveMessageProcessor.execute(WeaveMessageProcessor.scala:121) 
    at com.mulesoft.weave.mule.WeaveMessageProcessor.process(WeaveMessageProcessor.scala:67) 

Регистратор показывает полезную нагрузку и flowVar быть в формате JSON, но ошибка выглядит она читает его как хэш-карту. Не знаете, что вызывает ошибку?

Test URL:

http://localhost:8083/api/test 

XML поток:

<?xml version="1.0" encoding="UTF-8"?> 

    <mule xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw" xmlns:metadata="http://www.mulesoft.org/schema/mule/metadata" xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:mongo="http://www.mulesoft.org/schema/mule/mongo" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" 
     xmlns:spring="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd 
    http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd 
    http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd 
    http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd 
    http://www.mulesoft.org/schema/mule/mongo http://www.mulesoft.org/schema/mule/mongo/current/mule-mongo.xsd 
    http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd 
    http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd"> 
     <flow name="getFlow"> 
      <http:listener config-ref="testdata-httpListenerConfig" path="/test" doc:name="HTTP"/> 
     <set-variable variableName="varTest" value="{ &quot;products&quot;: [{  &quot;product&quot;: &quot;phone&quot;,   &quot;price&quot;: &quot;499.99&quot; }]}" mimeType="application/json" doc:name="Variable"/> 
     <set-payload value="[{ &quot;stores&quot;: { &quot;storeId&quot;: &quot;1234&quot; } }]" mimeType="application/json" doc:name="Set Payload"/> 
     <json:json-to-object-transformer returnClass="java.lang.Object" doc:name="JSON to Object"/> 
     <foreach doc:name="For Each" collection="#[payload]"> 
      <json:object-to-json-transformer mimeType="application/json" doc:name="Object to JSON"/> 
      <logger message="#['**** Stores JSON Payload: ' + payload]" level="INFO" doc:name="Logger"/> 
      <logger message="#['*** Products JSON flowvar' + flowVars.varTest]" level="INFO" doc:name="Logger"/> 
      <dw:transform-message metadata:id="43b88f1f-032a-442f-94f7-09fbc853390b" doc:name="Transform Message"> 
       <dw:input-payload mimeType="application/json" doc:sample="C:\getStores.json"/> 
       <dw:input-variable mimeType="application/json" variableName="varTest" doc:sample="sample_data\list_json_15.json"/> 
       <dw:set-payload><![CDATA[%dw 1.0 
%input payload application/json 
%input in1 application/json 
%output application/json 
--- 
{ 
    stores: { 
     storeId: payload.stores.storeId 
    }, 
    products: flowVars.varTest.products map ((product , indexOfProduct) -> { 
     product: product.product, 
     price: product.price 
    }) 
}]]></dw:set-payload> 
      </dw:transform-message>     
      <logger message="#[payload]" level="INFO" doc:name="Logger"/> 
      </foreach> 
     </flow> 
    </mule> 

Магазины JSON Payload:

{ 
    "stores": { 
     "storeId": "1234" 
    }, 
    "products": [] 
} 

Продукты

{ 
    "products": [{ 
     "product": "phone", 
     "price": "499.99" 
    }] 
} 

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

{ 
    "stores": { 
     "storeId": "1234" 
    }, 
    "products": [{ 
     "product": "phone", 
     "price": "499.99" 
    }] 
} 

Благодарности

+1

Можете ли вы выслать мне ожидаемый ответ JSON? Я предполагаю, что вышеупомянутые «магазины JSON Payload» и «Products json» являются полезной нагрузкой ввода. –

+0

Учитывая, что Mule сначала сохраняет ваши объекты Json как строку, ваша «полезная нагрузка» в настоящее время не выполняется. Если вы поместите точку прерывания перед 'for-each' (возможно, в трансформаторе' 'JSON to Object') и выполните переход, вы увидите, что ваш цикл никогда не запускается. Вы также должны увидеть следующее сообщение в консоли: 'org.mule.routing.ExpressionSplitter: Splitter не дал никаких результатов. Если этого не ожидается, проверьте свое разделенное выражение'. Если это так, то сначала конвертируйте свою полезную нагрузку в истребитель. –

+0

Это потому, что «' loadload.stores' »будет возвращен как« null », поэтому, если нет значения (или, по крайней мере, не одного, которое может использовать' for-each'), он никогда не войдет в цикл. Вы должны изменить этот оператор на 'payload [0] .stores', чтобы явно вызвать первый элемент в вашем объекте. –

ответ

0

спасибо за глядя на это. Я нашел решение.

Когда я обновил свою коллекцию foreach, чтобы указать json: вместо полезной нагрузки <foreach collection="json:" doc:name="For Each">, тогда я нашел, что она выполнена успешно и она может проходить через цикл без необходимости конвертировать ее в список хеш-карт Java.

Я все еще немного смущен, почему это работает, потому что, хотя я перешел на Java и перебирал список, я преобразовал полезную нагрузку обратно в JSON с использованием трансформатора Object to JSON, но выглядит так, будто он не был действительно преобразован в этом экземпляре и поток по-прежнему обрабатывал его как Java.