私はミュールDataweave変圧器は、メッセージペイロード ミュールJSONツーオブジェクト・トランスとDataweaverトランス例外
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 : [email protected]
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)
- を得ることの問題を持っていますID
- のためのいくつかのJSONを取得するためのHTTP呼び出し初期Dataweaveは、私が使用しているJSONからいくつかの値を抽出するために、新しいJSONスキーマ
にJSONを変換する変換んJSON:JSONオブジェクトトランス-に私は
<enricher target="#[flowVars.ownerAuthorisationJsonMap]" doc:name="Copy to JSON map"> <json:json-to-object-transformer returnClass="java.util.HashMap" doc:name="JSON to Object"/> </enricher>
私は、さらにいくつかを取得するためにサブフローを呼び出すマップへの変換を許可し、そのまま元のペイロードを保つためにflowVarをターゲットenricherでこれを入れています後で豊かになる日付。サブフローは、別のflowVar
2 Dataweave Transformerでenricherの結果を格納する第1 DataweaveトランスからJSONスキーマ出力を受け取り、データを使用して、いくつかの欠損値は、サブフロー(例えばショーによってルックアップ豊か(例外は取得) 1つではありませんが、マップには多くがあります)。これは例外を取得します。
しかし、私のネストされたJSONからオブジェクトへのトランスでenricherをコメントアウト
<enricher target="#[flowVars.ownerAuthorisationJsonMap]" doc:name="Copy to JSON map">
<json:json-to-object-transformer returnClass="java.util.HashMap" doc:name="JSON to Object"/>
</enricher>
第二dataweaveが正常に動作します(しかし、その後、私はアクセスすることができない場合JSON内のデータ)。 json-to-object-transformerはものを混乱させるようですが、私がペイロードタイプをデバッグすると、JavaオブジェクトIDは同じままです。
json-to-object-transformerを使用してJSONへのMELアクセスを許可するのは、JSONパスが推奨されていないためです。
<?xml version="1.0" encoding="UTF-8"?>
<amqp:endpoint name="authorisationChangeQueueDef"
queueName="authorisation-change-queue" queueDurable="true"
exchangeName="authorisation-exchange" exchangeType="direct" exchangeDurable="true"
connector-ref="AMQP_Connector"
routingKey="authorisation-change-queue-routing-key" doc:name="authorisationChangeQueueDef">
<properties>
<spring:entry key="amqp-queue.x-dead-letter-exchange" value="authorisation-exchange" />
<spring:entry key="amqp-queue.x-dead-letter-routing-key" value="authorisation-change-queue-dead-routing-key" />
</properties>
</amqp:endpoint>
<flow name="subscribe-to-changeFlow" processingStrategy="synchronous">
<amqp:inbound-endpoint ref="authorisationChangeQueueDef" responseTimeout="10000" doc:name="authorisation-change-consumer" />
<set-variable variableName="authorisationId" value="#[message.payloadAs(java.lang.String)]" doc:name="set authorisation id"/>
<logger message="#['Authorisation Changed Event received. authorisation id: ' + flowVars.authorisationId]" level="INFO" doc:name="Logger"/>
<http:request config-ref="Mule_Authorisation_Management_API_HTTP_Request_Configuration" path="#['/authorisation/' + flowVars.authorisationId]" method="GET" doc:name="HTTP REST call to Authorisation API"/>
<dw:transform-message doc:name="Transform to basic owner-authorisation" metadata:id="1bdd6f7e-6b4b-415b-819d-e88b9ff7f92b">
<dw:input-payload mimeType="application/json"/>
<dw:set-payload resource="dwl/owner-authorisation-skeleton.dwl"/>
</dw:transform-message>
<logger message="#['type before ' + message.dataType.type]" level="INFO" doc:name="Logger"/>
<!-- Enricher targeting flowVar to keep original payload type intact -->
<enricher target="#[flowVars.ownerAuthorisationJsonMap]" doc:name="Copy to JSON map">
<json:json-to-object-transformer returnClass="java.util.HashMap" doc:name="JSON to Object"/>
</enricher>
<logger message="#['type after: ' + message.dataType.type]" level="INFO" doc:name="Logger"/>
<!-- subflow that uses flowVars.ownerAuthorisationJsonMap and MEL -->
<flow-ref name="enrich-Sub_Flow" doc:name="enrich-Sub_Flow"/>
<dw:transform-message doc:name="Final Transform Message" metadata:id="fa7e7663-50bb-4675-a8c8-e8cb311946a9">
<dw:input-payload mimeType="application/json"/>
<dw:set-payload resource="classpath:dwl/owner-authorisation-enrichment.dwl"/>
</dw:transform-message>
<logger level="INFO" doc:name="Logger all "/>
<!-- Does a manual ACK to RabbitMQ, only do once we know all the processing is complete -->
<amqp:acknowledge-message doc:name="AMQP-0-9 Acknowledge Message"/>
<rollback-exception-strategy maxRedeliveryAttempts="3" doc:name="Rollback Exception Strategy">
<logger message="#['REQUESTING RETRY OF REQUEST... delivery-tag : ' + message.inboundProperties['delivery-tag']]" level="INFO" doc:name="Logger"/>
<!-- re-queue message for re-tries -->
<amqp:reject-message requeue="true" doc:name="AMQP-0-9 Reject Message" />
<on-redelivery-attempts-exceeded>
<logger message="REDELIVERY EXHAUSTED" level="ERROR" doc:name="Logger"/>
<amqp:reject-message doc:name="AMQP-0-9 Reject Message" />
</on-redelivery-attempts-exceeded>
</rollback-exception-strategy>
</flow>
<sub-flow name="enrich-Sub_Flow">
<set-variable variableName="organisationId" value="#[ownerAuthorisationJsonMap.organisationId]" doc:name="Extract Organisation Id" encoding="UTF-8" mimeType="application/json"/>
<enricher target="#[flowVars.organisationName]" source="#[payload.organisationLatestDetail.organisationName]" doc:name="Message Enricher">
<processor-chain doc:name="Processor Chain">
<flow-ref name="get-organisation-details-SubFlow" doc:name="get-organisation-details-Sub_Flow" />
<json:json-to-object-transformer returnClass="java.util.HashMap" doc:name="JSON to Object"/>
<logger level="INFO" message="Org Name :- Id:- #[payload.organisationLatestDetail.organisationName]" doc:name="Logger"/>
</processor-chain>
</enricher>
</sub-flow>
<sub-flow name="get-organisation-details-SubFlow">
<http:request config-ref="VOA_Mule_Customer_Management_API_HTTP_Request_Configuration" path="#['/organisation?organisationId='+ flowVars.organisationId]" method="GET"
doc:name="HTTP - Get Customer details">
</http:request>
</sub-flow>
Dataweave 1
%dw 1.0
%output application/json
---
{
authorisationId: payload.id,
uarn: payload.uarn,
authorisedParties: payload.parties map ((party , indexOfParty) -> {
organisationId: party.authorisedPartyOrganisationId,
status: party.authorisedPartyStatus,
startDate: party.startDate
}),
endDate: payload.endDate,
organisationId: payload.authorisationOwnerOrganisationId,
propertyLinkSubmissionId: payload.submissionId,
startDate: payload.startDate,
status: payload.authorisationStatus
}
Dataweave 2(これもJavaの地図からさらにマッピングを持つことになります)
%dw 1.0
%output application/json
---
{
authorisationId: payload.authorisationId,
authorisedParties: payload.authorisedParties map ((authorisedParty , indexOfAuthorisedParty) -> {
organisationId: authorisedParty.organisationId,
startDate: authorisedParty.startDate,
status: authorisedParty.status
}),
endDate: payload.endDate,
organisationId: payload.organisationId,
organisationName: flowVars.organisationName,
propertyLinkSubmissionId: payload.propertyLinkSubmissionId,
startDate: payload.startDate,
status: payload.status,
uarn: payload.uarn
}
ログ
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
私はストリームをリセットします。 ところで、json:pathの使用を避けるのが最善でしょうか? json-to-object-transformerを避け、代わりにJSONパスを使用することで、動作するようになりました。 – Pete
JSONパスは推奨されておらず、Mule 4では削除される予定ですので、回避することをお勧めします。 https://forums.mulesoft.com/questions/26717/correct-way-of-accessing-json-payload-in-mule-37.html –
答えをいただきありがとうございます。しかし、私は今、さらなる問題を発見しました。私たちの質問を参照してくださいhttps://stackoverflow.com/questions/45689371/mule-if-flowvar-used-in-dataweave-transformer-payload-converted-to 2番目のDataweaveトランスフォーマーで使用されるflowVar私たちのペイロードはマップに変換されます-地図 – Pete