Mule json到对象转换器和Dataweaver转换器异常
我对骡子的数据收集有意见Mule json到对象转换器和Dataweaver转换器异常,mule,mule-el,Mule,Mule El,我对骡子的数据收集有意见 INFO 2017-08-10 15:05:52,787 [amqpReceiver.02] org.mule.api.processor.LoggerMessageProcessor: Authorisation Changed Event received. authorisation id: 1 INFO 2017-08-10 15:05:57,844 [amqpReceiver.02] org.mule.api.processor.LoggerMessage
INFO 2017-08-10 15:05:52,787 [amqpReceiver.02] org.mule.api.processor.LoggerMessageProcessor: Authorisation Changed Event received. authorisation id: 1
INFO 2017-08-10 15:05:57,844 [amqpReceiver.02] org.mule.api.processor.LoggerMessageProcessor: type before class com.mulesoft.weave.reader.ByteArraySeekableStream
INFO 2017-08-10 15:06:02,058 [amqpReceiver.02] org.mule.api.processor.LoggerMessageProcessor: type after: class com.mulesoft.weave.reader.ByteArraySeekableStream
INFO 2017-08-10 15:06:13,309 [amqpReceiver.02] org.mule.api.processor.LoggerMessageProcessor: Org Name :- Id:- Org Name 3
ERROR 2017-08-10 15:06:15,520 [amqpReceiver.02] org.mule.exception.RollbackMessagingExceptionStrategy:
********************************************************************************
Message : Exception while executing:
{
^
Unexpected end-of-input at index 0 (line 1, position 1), expected JSON Value
Payload : com.mulesoft.weave.reader.ByteArraySeekableStream@a622be8
Element : /subscribe-to-changeFlow/processors/8 @ voa-009-mule-authorisation-search-api:test.xml:60 (Final Transform Message)
Element XML : <dw:transform-message doc:name="Final Transform Message" metadata:id="fa7e7663-50bb-4675-a8c8-e8cb311946a9">
<dw:input-payload mimeType="application/json"></dw:input-payload>
<dw:set-payload resource="classpath:dwl/owner-authorisation-enrichment.dwl"></dw:set-payload>
</dw:transform-message>
--------------------------------------------------------------------------------
Root Exception stack trace:
com.mulesoft.weave.reader.json.JsonReaderException: Unexpected end-of-input at index 0 (line 1, position 1), expected JSON Value
at com.mulesoft.weave.reader.json.JsonTokenizer.fail(JsonTokenizer.scala:193)
at com.mulesoft.weave.reader.json.JsonTokenizer.readValue(JsonTokenizer.scala:49)
at com.mulesoft.weave.reader.json.JsonTokenizer.tokens(JsonTokenizer.scala:16)
at com.mulesoft.weave.reader.json.JsonReader.root(JsonReader.scala:17)
at com.mulesoft.weave.mule.reader.ReusableReader.root(ReusableReader.scala:12)
at com.mulesoft.weave.engine.EvaluationContext$InternalExecutionContext$$anonfun$3.apply(EvaluationContext.scala:106)
Dataweave2(这也将有来自Java映射的进一步映射)
日志
这个问题是由json-to-object转换器使用的json有效负载流引起的,尽管它在消息enricher中,但没有被重置。 见本期- 最简单的解决方案是在消息enricher之后重置流:
...
<enricher target="#[flowVars.myMar]" doc:name="Message Enricher">
<json:json-to-object-transformer doc:name="JSON to Object"/>
</enricher>
<expression-component doc:name="Expression">
<![CDATA[payload.seek(0);]]>
</expression-component>
...
...
<object-to-string-transformer doc:name="Object to String"/>
<enricher target="#[flowVars.myMar]" doc:name="Message Enricher">
...
。。。
...
或者在使用消息enricher之前将有效负载转换为字符串:
...
<enricher target="#[flowVars.myMar]" doc:name="Message Enricher">
<json:json-to-object-transformer doc:name="JSON to Object"/>
</enricher>
<expression-component doc:name="Expression">
<![CDATA[payload.seek(0);]]>
</expression-component>
...
...
<object-to-string-transformer doc:name="Object to String"/>
<enricher target="#[flowVars.myMar]" doc:name="Message Enricher">
...
。。。
...
仅供参考,我用以下更简单的流程复制了该问题:
<flow name="flow">
<dw:transform-message doc:name="Transform Message">
<dw:set-payload>
<![CDATA[%dw 1.0
%output application/json
---
{
foo:0
}]]>
</dw:set-payload>
</dw:transform-message>
<enricher target="#[flowVars.myVar]" doc:name="Message Enricher">
<json:json-to-object-transformer doc:name="JSON to Object"/>
</enricher>
<dw:transform-message doc:name="Transform Message">
<dw:set-payload>
<![CDATA[%dw 1.0
%output application/json
---
payload
]]>
</dw:set-payload>
</dw:transform-message>
</flow>
感谢您的及时回复,我将重置流。顺便问一下,最好避免使用json:path吗?正如我通过避免json-to-object转换器并使用json-path实现的那样。json-path已被弃用,将在Mule 4中删除,因此最好避免使用它。感谢您的回答,但是我现在发现了一个进一步的问题,如果在第二个Dataweave Transformer中使用了flowVar us,那么有效负载将转换为地图,请参见我的问题
INFO 2017-08-10 15:05:52,787 [amqpReceiver.02] org.mule.api.processor.LoggerMessageProcessor: Authorisation Changed Event received. authorisation id: 1
INFO 2017-08-10 15:05:57,844 [amqpReceiver.02] org.mule.api.processor.LoggerMessageProcessor: type before class com.mulesoft.weave.reader.ByteArraySeekableStream
INFO 2017-08-10 15:06:02,058 [amqpReceiver.02] org.mule.api.processor.LoggerMessageProcessor: type after: class com.mulesoft.weave.reader.ByteArraySeekableStream
INFO 2017-08-10 15:06:13,309 [amqpReceiver.02] org.mule.api.processor.LoggerMessageProcessor: Org Name :- Id:- Org Name 3
...
<enricher target="#[flowVars.myMar]" doc:name="Message Enricher">
<json:json-to-object-transformer doc:name="JSON to Object"/>
</enricher>
<expression-component doc:name="Expression">
<![CDATA[payload.seek(0);]]>
</expression-component>
...
...
<object-to-string-transformer doc:name="Object to String"/>
<enricher target="#[flowVars.myMar]" doc:name="Message Enricher">
...
<flow name="flow">
<dw:transform-message doc:name="Transform Message">
<dw:set-payload>
<![CDATA[%dw 1.0
%output application/json
---
{
foo:0
}]]>
</dw:set-payload>
</dw:transform-message>
<enricher target="#[flowVars.myVar]" doc:name="Message Enricher">
<json:json-to-object-transformer doc:name="JSON to Object"/>
</enricher>
<dw:transform-message doc:name="Transform Message">
<dw:set-payload>
<![CDATA[%dw 1.0
%output application/json
---
payload
]]>
</dw:set-payload>
</dw:transform-message>
</flow>