2017-08-10 12 views
1

私はミュールDataweave変圧器は、メッセージペイロード ミュールJSONツーオブジェクト・トランスとDataweaverトランス例外

  • が作るようなフローがIDを受信

    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 
    
  • 答えて

    1

    この問題は、JSONペイロードストリームがjson-to-object-transformerによって消費され、メッセージが豊富であるにもかかわらずリセットされていないことが原因です。 この号を参照 - https://www.mulesoft.org/jira/browse/MULE-10623

    最も簡単な解決策は、メッセージ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> 
    ... 
    

    またはメッセージenricherを使用する前に、文字列にペイロードを回す:

    ... 
    <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> 
    
    +0

    私はストリームをリセットします。 ところで、json:pathの使用を避けるのが最善でしょうか? json-to-object-transformerを避け、代わりにJSONパスを使用することで、動作するようになりました。 – Pete

    +0

    JSONパスは推奨されておらず、Mule 4では削除される予定ですので、回避することをお勧めします。 https://forums.mulesoft.com/questions/26717/correct-way-of-accessing-json-payload-in-mule-37.html –

    +0

    答えをいただきありがとうございます。しかし、私は今、さらなる問題を発見しました。私たちの質問を参照してくださいhttps://stackoverflow.com/questions/45689371/mule-if-flowvar-used-in-dataweave-transformer-payload-converted-to 2番目のDataweaveトランスフォーマーで使用されるflowVar私たちのペイロードはマップに変換されます-地図 – Pete

    関連する問題