Mule转换消息

Mule转换消息,mule,mule-studio,dataweave,Mule,Mule Studio,Dataweave,我正在将Salesforce的数据集成到另一个API。源有1个具有相关子对象的对象。然而,目标API需要采取如下形式。子对象中的每个相关Salesforce记录都需要子窗体中的节点。下面的POST示例是负载的最终期望形式 我想我需要使用DataWeave递归,利用Salesforce的For-Each-with-Each子记录。但我不太确定从哪里开始 以下是来自Salesforce post主题的传入JSON: { "LastModifiedDate": "2016-09-22T14:19:

我正在将Salesforce的数据集成到另一个API。源有1个具有相关子对象的对象。然而,目标API需要采取如下形式。子对象中的每个相关Salesforce记录都需要子窗体中的节点。下面的POST示例是负载的最终期望形式

我想我需要使用DataWeave递归,利用Salesforce的For-Each-with-Each子记录。但我不太确定从哪里开始

以下是来自Salesforce post主题的传入JSON:

{
  "LastModifiedDate": "2016-09-22T14:19:08.000+0000",
  "Engagement__c": "1234",
  "Product_CoC__c": null,
  "Name": "Prod-22880",
  "Year_1_Approved_Production_Hectares__c": 100.0,
  "Year_1_Approved_Production_Volume__c": 1000.0,
  "Product_Variety__c": null,
  "CreatedById": "1234",
  "Year_2_Estimated_Production_Volume__c": 1001.0,
  "Product__c": "1234",
  "Engagement_Decision_Date__c": null,
  "Year_1_Harvest_Period__c": "2016",
  "CPH_Number__c": null,
  "Product_Type__c": null,
  "Certificate_Product__c": "1234",
  "IsDeleted": false,
  "Crop_Yield__c": 10.0,
  "Year_2_Estimated_Production_Hectares__c": 100.0,
  "Valid_Period_End_Date__c": null,
  "Intercrop__c": false,
  "SystemModstamp": "2016-09-22T14:19:08.000+0000",
  "Year_2_Harvest_Period__c": null,
  "Crop_Production_Unit__c": "kg",
  "Certificate__c": "1234",
  "Year__c": 1.0,
  "Harvest_Frequency__c": "Single",
  "CreatedDate": "2016-07-28T15:44:18.000+0000",
  "Valid_Period_Start_Date__c": null,
  "Id": "1234",
  "LastModifiedById": "1234",
  "RA_Id__c": null
}
下面是我对子对象的转换消息:

%dw 1.0
%output application/java
---
{
    acv_crop3:flowVars.ChainpointCropID default "",
    acv_cph3:payload.Name default "",
    acv_harvest_period2:payload.Year_1_Harvest_Period__c default "",
    acv_frequency2:flowVars.frequency default "",
    acv_aq2:payload.Year_1_Approved_Production_Volume__c default "",
    acv_cph4:payload.Year_1_Approved_Production_Hectares__c default "",
    acv_yield2:payload.Crop_Yield__c default "",
    acv_start_date2:payload.Valid_Period_Start_Date__c default "",
    acv_end_date2:payload.Valid_Period_End_Date__c default "",
    acv_uom2:flowVars.uom default ""
}
以下是所需POST有效负载的示例:

{
  "ownerId": 24695,
  "Q_CERT_SFGUID": "a00G000000WR3xxxxx",
  "Q_CERT": "467",
  "Q_CERTCROP2": [
    "1199"
  ],
  "textId": "auto",
  "resultDate": null,
  "authorId": null,
  "Q_CERTNO": "RA-G-",
  "Q_CERTHL": 24695,
  "Q_CERTCB": 43986,
  "Q_CERTST": "NO_STATUS",
  "Q_CERTSUB": "",
  "Q_CERTSTDATE": "2016-06-30",
  "Q_CERT_expiration_date": "2019-06-29",
  "Q_CERTENDATE": "",
  "Q_CERT_redate": "2016-06-30",
  "Q_CERT_CHA": "8.0",
  "Q_CERT_TPH": "8.0",
  "Q_CERT_CONTACT_EMAIL": "m@gmail.com",
  "Q_CERT_CONTACT_NAME": 1300,
  "subforms": [
    {
      "textId": "acv2",
      "rows": [
        {
          "acv_crop3": "1199",
          "acv_cph3": "Prod-22880",
          "acv_harvest_period2": "2016",
          "acv_frequency2": 668,
          "acv_aq2": 1000,
          "acv_cph4": 100,
          "acv_yield2": 10,
          "acv_start_date2": "2099-12-31",
          "acv_end_date2": "2099-12-31",
          "acv_uom2": 557
        },
        {
          "acv_crop3": "1100",
          "acv_cph3": "Prod-22881",
          "acv_harvest_period2": "2017",
          "acv_frequency2": 668,
          "acv_aq2": 1000,
          "acv_cph4": 100,
          "acv_yield2": 1000,
          "acv_start_date2": "2017-12-31",
          "acv_end_date2": "2018-12-31",
          "acv_uom2": 557
        }
      ]
    }
  ]
}
这是我到目前为止关于转换消息的流程

    <flow name="prepareEP">
        <set-variable variableName="API_Path" value="v0/forms/FR_CERT" doc:name="engagementProduct API_URL"/>
        <set-variable variableName="entityType" value="engagementProduct" doc:name="set Entity"/>
        <component class="com.ww.mule.reporting.et.ObjectStoreController" doc:name="load countryDiccionary"/>
        <set-variable variableName="originalPayloadEP" value="#[payload]" doc:name="original payload"/>
        <json:json-to-object-transformer returnClass="java.util.Map" doc:name="JSON to Object"/>
        <set-variable variableName="originalPayloadEPMap" value="#[payload]" doc:name="original payload map"/>
        <logger message="#['About to query certificate ' + flowVars.originalPayloadEPMap.Certificate__c + ' with engagement product Id ' + flowVars.originalPayloadEPMap.Id]" level="INFO" doc:name="Logger"/>
        <sfdc:query config-ref="Salesforce__Basic_Authentication"  doc:name="Get Engagement Products By Cert" query="dsql:SELECT Id,Name,Year_1_Harvest_Period__c,Harvest_Frequency__c,Year_1_Approved_Production_Volume__c,Year_1_Approved_Production_Hectares__c,Crop_Yield__c,Valid_Period_Start_Date__c,Valid_Period_End_Date__c FROM Engagement_Product__c WHERE Certificate__c = '#[flowVars.originalPayloadEPMap.Certificate__c]'"/>
        <foreach doc:name="For Each">
            <json:object-to-json-transformer doc:name="Object to JSON"/>
            <objectstore:retrieve config-ref="CountryStoreObjectStore" key="#[payload.Cert_Country__c == empty?'UNKNOWN_COUNTRY':payload.Cert_Country__c]" targetProperty="countryISO" doc:name="ObjectStore" defaultValue-ref="#['XX']"/>
            <set-payload value="#[flowVars.originalPayloadEP]" mimeType="application/json" doc:name="Set Payload"/>
            <set-variable variableName="frequency" value="#[originalPayloadEPMap.Harvest_Frequency__c == 'Single' ? 668 : originalPayloadEPMap.Harvest_Frequency__c == 'Multiple' ? 669 : originalPayloadEPMap.Harvest_Frequency__c == 'Permanent/Continuous' ? 667 : originalPayloadEPMap.Harvest_Frequency__c == 'Occasional' ? 1910 : null]" doc:name="Set Harvest Frequency Variable"/>
            <set-variable variableName="uom" value="#[originalPayloadEPMap.Crop_Production_Unit__c == 'kg' ? 557 : originalPayloadEPMap.Crop_Production_Unit__c == 'Liters' ? 596 : originalPayloadEPMap.Crop_Production_Unit__c == 'Number of Stems' ? 1802 : originalPayloadEPMap.Crop_Production_Unit__c == 'mts2' ? 556 : null]" doc:name="Set UOM Variable"/>
            <!--
            <set-payload   doc:name="Set Payload"/>
            --> 
            <dw:transform-message doc:name="Transform Message">
                <dw:set-payload><![CDATA[%dw 1.0
%output application/java
---
{
    acv_crop3:flowVars.ChainpointCropID default "",
    acv_cph3:payload.Name default "",
    acv_harvest_period2:payload.Year_1_Harvest_Period__c default "",
    acv_frequency2:flowVars.frequency default "",
    acv_aq2:payload.Year_1_Approved_Production_Volume__c default "",
    acv_cph4:payload.Year_1_Approved_Production_Hectares__c default "",
    acv_yield2:payload.Crop_Yield__c default "",
    acv_start_date2:payload.Valid_Period_Start_Date__c default "",
    acv_end_date2:payload.Valid_Period_End_Date__c default "",
    acv_uom2:flowVars.uom default ""
}]]>
                </dw:set-payload>
            </dw:transform-message>
            <object-to-string-transformer mimeType="application/json" doc:name="Object to String"/>
            <set-variable variableName="acv2_info" value="#[flowVars.acv2_info == null ? payload : flowVars.acv2_info + ',' + payload]" doc:name="acv2_info"/>
            <logger message="#['acv2_info = ' + flowVars.acv2_info]" level="INFO" doc:name="Logger"/>
            <set-variable variableName="transformedPayload" value="#[payload]" doc:name="save payload"/>
            <logger message="#['transformedPayload = ' + flowVars.transformedPayload]" level="INFO" doc:name="Print transformedPayload"/>
        </foreach>
        <flow-ref name="sendAuthenticatedChainPointRequest" doc:name="sendAuthenticatedChainPointRequest"/>
    </flow>


请发布您的输入数据谢谢您的关注Anil!我已经在上面的问题中加入了传入的JSON。您的问题是什么?您的输出需要
“ownerId”:24695
,但我没有看到与此相关的字段?那是从哪里来的?您是否仅尝试建立
子元素?我需要你提供更多的信息。是的,这是正确的。我试图只建立rows子元素。对于有效负载的第一部分,我有一个转换消息。每个相关的Salesforce记录(在上面的第一个有效负载中表示)都是一个子对象,我需要它位于所需POST有效负载的子表单节点中。从我最初的帖子开始,我有一个For-Each,它可以正确地递归,但是仍然无法构建流变量。我将在这里发布流程。