Search code examples
jsonxpathmulemule-el

How to extract all the JSON value in Mule ind insert to DB


I have a REST service in my Mule flow :-

<flow name="restServiceFlow1" doc:name="restFlow1">
        <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8082" doc:name="HTTP"/>
        <jersey:resources doc:name="REST">
            <component class="com.test.services.schema.maindata.v1.Impl.MainDataImpl"/>
        </jersey:resources>
 </flow>

and I have another flow which sends JSON request from a file to that service flow and consume it :-

<flow name="restFlow2" doc:name="restFlow2">
 <file:inbound-endpoint path="E:\backup\test" responseTimeout="10000" doc:name="File" connector-ref="File_Global">
                        <file:filename-regex-filter pattern="aa.txt" caseSensitive="false"/>
 </file:inbound-endpoint>

        <json:json-to-object-transformer returnClass="java.util.HashMap" doc:name="JSON to Object"/>
        <http:outbound-endpoint exchange-pattern="request-response" contentType="application/json" method="GET" address="http://localhost:8082/getData/insert/?id=#[payload.insertDataRequest[0].id]&amp;name=#[payload.insertDataRequest[0].name]&amp;age=#[payload.insertDataRequest[0].age]&amp;designation=#[payload.insertDataRequest[0].designation]" doc:name="HTTP"/>
     </flow>

Now my JSON request is :-

{
    "insertDataRequest": [
        {
            "id": "6",
            "name": "ddddd",
            "age": "55",
            "designation": "WQQQQQ"
        },
        {
            "id": "64",
            "name": "mmmm",
            "age": "545",
            "designation": "TTTTTTTTTT"
        }
    ]
}

Now, the issue is whenever I place the JSON request as a file ... only the first Data is inserted .. that is only

{
                "id": "6",
                "name": "ddddd",
                "age": "55",
                "designation": "WQQQQQ"
 }

is getting inserted in DB ..enter image description here

.... .... Now I want all the Data to be inserted in Database ... How can I achieve it ?? ..Do I need any for each to get all the Data ??... Please Help...


Solution

  • Use a for each block to iterate on the insertDataRequest entries:

    <flow name="restFlow2">
      <file:inbound-endpoint path="E:\backup\test" responseTimeout="10000" connector-ref="File_Global">
        <file:filename-regex-filter pattern="aa.txt" caseSensitive="false"/>
      </file:inbound-endpoint>
    
      <json:json-to-object-transformer returnClass="java.util.HashMap"/>
    
      <foreach collection="#[payload.insertDataRequest]">
        <http:outbound-endpoint exchange-pattern="request-response"
              contentType="application/json" method="GET"
              address="http://localhost:8082/getData/insert/?id=#[payload.id]&amp;name=#[payload.name]&amp;age=#[payload.age]&amp;designation=#[payload.designation]"/>
      </foreach>
    </flow>
    

    Note that the fact you're performing insertions with GET instead of a POST is not respectful of the REST principles...