Search code examples
salesforcemuleanypoint-studio

Type mismatch error in mule when creating an order item in salesforce


I am trying to get to grips with creating orders in Salesforce. I have created an order in the work flow and am now trying to assign the products associated with the order so I am trying to insert order items into Salesforce using Mule 3.7.3.

My workflow is currently returning the following error:

********************************************************************************
Message               : Exception while executing: 
payload.OrderItems.records map ((record , indexOfRecord) -> {
        ^
Type mismatch
     found :name, :string
  required :name, :object
Type                  : com.mulesoft.weave.mule.exception.WeaveExecutionException
Code                  : MULE_ERROR--2
********************************************************************************
Exception stack is:
1. Type mismatch
     found :name, :string
  required :name, :object (com.mulesoft.weave.engine.ast.dynamic.DynamicDispatchException)
  com.mulesoft.weave.engine.ast.dynamic.DynamicDispatchNode:65 (null)
2. Exception while executing: 
payload.OrderItems.records map ((record , indexOfRecord) -> {
        ^
Type mismatch
     found :name, :string
  required :name, :object (com.mulesoft.weave.mule.exception.WeaveExecutionException)
  com.mulesoft.weave.mule.WeaveMessageProcessor:124 (null)
********************************************************************************
Root Exception stack trace:
com.mulesoft.weave.engine.ast.dynamic.DynamicDispatchException: Type mismatch
     found :name, :string
  required :name, :object

The payload for the workflow is taken from the Salesforce website here: https://developer.salesforce.com/docs/atlas.en-us.api_placeorder.meta/api_placeorder/sforce_placeorder_rest_api_place_order_account.htm and the transform message shows a result in preview without errors but then fails when I run the workflow.

Can anyone help?

Payload:

{
    "order": {
        "attributes": {
            "type": "Order"
        },
        "EffectiveDate": "2016-10-18",
        "Status": "Draft",
        "billingCity": "SFO-Inside-OrderEntity-1",
        "accountId": "0012400000LKPfzAAH",
        "Pricebook2Id": "01s24000002JoD1AAK",
        "OrderItems": {
            "records": [{
                "attributes": {
                    "type": "OrderItem"
                },
                "PricebookEntryId": "01u24000001rauFAAQ",
                "quantity": "1",
                "UnitPrice": "15.99"
            }]
        }
    }
}

Mule XML workflow:

<?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:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:sfdc="http://www.mulesoft.org/schema/mule/sfdc" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:apikit="http://www.mulesoft.org/schema/mule/apikit" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:spring="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.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/apikit http://www.mulesoft.org/schema/mule/apikit/current/mule-apikit.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.mulesoft.org/schema/mule/sfdc http://www.mulesoft.org/schema/mule/sfdc/current/mule-sfdc.xsd
http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd">
    <http:listener-config name="order-flow-httpListenerConfig" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration" basePath="/api"/>
    <apikit:config name="order-flow-config" raml="order-flow.raml" consoleEnabled="true" consolePath="console" doc:name="Router"/>
    <sfdc:config name="Salesforce__Basic_Authentication" username="${sf.username}" password="${sf.password}" securityToken="${sf.token}" doc:name="Salesforce: Basic Authentication"/>
    <apikit:config name="Router" raml="order-flow.raml" consoleEnabled="true" consolePath="console" doc:name="Router">
        <apikit:flow-mapping resource="/orders/order" action="post" content-type="application/json" flow-ref="post:/orders/order:order-flow-config"/>
    </apikit:config>
    <flow name="order-flow-main">
        <http:listener config-ref="order-flow-httpListenerConfig" path="/*" doc:name="HTTP"/>
        <apikit:router config-ref="Router" doc:name="APIkit Router"/>
        <exception-strategy ref="order-flow-apiKitGlobalExceptionMapping" doc:name="Reference Exception Strategy"/>
    </flow>

    <flow name="post:/orders/order:order-flow-config">
        <set-payload value="{&quot;order&quot;:{&quot;attributes&quot;:{&quot;type&quot;:&quot;Order&quot;},&quot;EffectiveDate&quot;:&quot;2016-10-18&quot;,&quot;Status&quot;:&quot;Draft&quot;,&quot;billingCity&quot;:&quot;SFO-Inside-OrderEntity-1&quot;,&quot;accountId&quot;:&quot;0012400000LKPfzAAH&quot;,&quot;Pricebook2Id&quot;:&quot;01s24000002JoD1AAK&quot;,&quot;OrderItems&quot;:{&quot;records&quot;:[{&quot;attributes&quot;:{&quot;type&quot;:&quot;OrderItem&quot;},&quot;PricebookEntryId&quot;:&quot;01u24000001rauFAAQ&quot;,&quot;quantity&quot;:&quot;1&quot;,&quot;UnitPrice&quot;:&quot;15.99&quot;}]}}}" mimeType="application/json" doc:name="Set Payload"/>
        <dw:transform-message metadata:id="054c5e6b-272f-4970-8c1c-d97cd802e792" doc:name="Transform Message">
            <dw:set-payload><![CDATA[%dw 1.0
%output application/java
---
{
    ContractId: "80024000000OhfWAAS",
    AccountId: payload.order.accountId,
    Pricebook2Id: payload.order.Pricebook2Id,
    EffectiveDate: payload.order.EffectiveDate as :date,
    Status: payload.order.Status,
    Type: payload.order.attributes.type,
    BillingCity: payload.order.billingCity
}]]></dw:set-payload>
        </dw:transform-message>
        <sfdc:create-single config-ref="Salesforce__Basic_Authentication"  doc:name="Salesforce" type="Order">
            <sfdc:object ref="#[payload]"/>
        </sfdc:create-single>
        <set-variable variableName="varOrderId" value="#[payload.id]" doc:name="Set Order Id"/>
        <object-to-string-transformer doc:name="Object to String"/>
        <logger message="#[payload]" level="INFO" doc:name="Logger"/>
        <set-payload value="{&quot;OrderItems&quot;:{&quot;records&quot;:[{&quot;attributes&quot;:{&quot;type&quot;:&quot;OrderItem&quot;},&quot;PricebookEntryId&quot;:&quot;01u24000001rauFAAQ&quot;,&quot;quantity&quot;:&quot;1&quot;,&quot;UnitPrice&quot;:&quot;15.99&quot;}]}}}" doc:name="Set Payload"/>
        <dw:transform-message metadata:id="a38edabd-4deb-413f-8bcb-5691e64bc230" doc:name="Transform Message">
            <dw:set-payload><![CDATA[%dw 1.0
%output application/java
---
payload.OrderItems.records map ((record , indexOfRecord) -> {
    OrderId: flowVars.varOrderId,
    UnitPrice: record.UnitPrice
})]]></dw:set-payload>
        </dw:transform-message>
        <sfdc:create config-ref="Salesforce__Basic_Authentication" type="OrderItem" doc:name="Salesforce">
            <sfdc:objects ref="#[payload]"/>
        </sfdc:create>
        <object-to-string-transformer doc:name="Object to String"/>
        <logger level="INFO" doc:name="Logger"/>

    </flow>
    <apikit:mapping-exception-strategy name="order-flow-apiKitGlobalExceptionMapping">
        <apikit:mapping statusCode="404">
            <apikit:exception value="org.mule.module.apikit.exception.NotFoundException" />
            <set-property propertyName="Content-Type" value="application/json" doc:name="Property"/>
            <set-payload value="{ &quot;message&quot;: &quot;Resource not found&quot; }" doc:name="Set Payload"/>
        </apikit:mapping>
        <apikit:mapping statusCode="405">
            <apikit:exception value="org.mule.module.apikit.exception.MethodNotAllowedException" />
            <set-property propertyName="Content-Type" value="application/json" doc:name="Property"/>
            <set-payload value="{ &quot;message&quot;: &quot;Method not allowed&quot; }" doc:name="Set Payload"/>
        </apikit:mapping>
        <apikit:mapping statusCode="415">
            <apikit:exception value="org.mule.module.apikit.exception.UnsupportedMediaTypeException" />
            <set-property propertyName="Content-Type" value="application/json" doc:name="Property"/>
            <set-payload value="{ &quot;message&quot;: &quot;Unsupported media type&quot; }" doc:name="Set Payload"/>
        </apikit:mapping>
        <apikit:mapping statusCode="406">
            <apikit:exception value="org.mule.module.apikit.exception.NotAcceptableException" />
            <set-property propertyName="Content-Type" value="application/json" doc:name="Property"/>
            <set-payload value="{ &quot;message&quot;: &quot;Not acceptable&quot; }" doc:name="Set Payload"/>
        </apikit:mapping>
        <apikit:mapping statusCode="400">
            <apikit:exception value="org.mule.module.apikit.exception.BadRequestException" />
            <set-property propertyName="Content-Type" value="application/json" doc:name="Property"/>
            <set-payload value="{ &quot;message&quot;: &quot;Bad request&quot; }" doc:name="Set Payload"/>
        </apikit:mapping>
    </apikit:mapping-exception-strategy>
</mule>

Thanks


Solution

  • You are getting this error as your are setting payload as string and trying to access as JSON. Either set mime type on set payload or to dataweave like

    Try this

     <set-payload mimeType="application/json" value="{&quot;OrderItems&quot;:{&quot;records&quot;:[{&quot;attributes&quot;:{&quot;type&quot;:&quot;OrderItem&quot;},&quot;PricebookEntryId&quot;:&quot;01u24000001rauFAAQ&quot;,&quot;quantity&quot;:&quot;1&quot;,&quot;UnitPrice&quot;:&quot;15.99&quot;}]}}}" doc:name="Set Payload" /> 
    

    Or

    <dw:transform-message doc:name="Transform Message">
                    <dw:input-payload mimeType="application/json" />
                    <dw:set-payload><![CDATA[%dw 1.0
        %output application/json
        %var timeZone = now as :datetime as :string {format:"z"} 
        ---
        payload.OrderItems.records map ((record , indexOfRecord) -> {
            OrderId: flowVars.varOrderId,
            UnitPrice: record.UnitPrice
        })  ]]></dw:set-payload>
    </dw:transform-message>
    

    Hope this helps.