How to create a deep insert structure using Olingo Client?

Viewed 89

How to POST the following JSON structure using Apache OLINGO client? What is the best way to build up this structure? Are there any examples?

{ 
"itemNumber": "ITEM1" 

"lines": [ 

    { 
        componentNumber":   "COMPONENT1" 
    }, 
    { 
        componentNumber":   "COMPONENT2"
    } 
] 
} 
2 Answers

The following Java example using the Olingo Client works for me to post the following JSON structure:

{ 
"itemNumber": "ITEM1" 

    "lines": [ 
    
        { 
            componentNumber":   "COMPONENT1" 
        }, 
        { 
            componentNumber":   "COMPONENT2"
        } 
    ] 
    }  

Java code using OLINGO CLient

public void deepInsertExample(){
        //Initiate the ODATA client
    ODataClient client = ODataClientFactory.getClient();
        client.getConfiguration();
        getClient().getObjectFactory();
        //Initiate the Client Object Factory
        ClientObjectFactory factory = getClient().getObjectFactory();
        //Create Line Item 1
        ClientEntity lineItem1 = factory.newEntity(new FullQualifiedName("ODATA.LineItem"));
        lineItem1.getProperties()
                .add(factory.newPrimitiveProperty("componentNumber", factory.newPrimitiveValueBuilder().buildString("COMPONENT2")));
        //Create Line Item 2      
    ClientEntity   lineItem2 = factory.newEntity(new FullQualifiedName("ODATA.LineItem"));
        lineItem2.getProperties()
                .add(factory.newPrimitiveProperty("componentNumber", factory.newPrimitiveValueBuilder().buildString("COMPONENT1")));
        //Initiate the entity set
        ClientEntitySet entitySet = factory.newEntitySet();
        //Add  Line Item 1 and Line Item 2 to the Enity 
        entitySet.getEntities().add(lineItem1);
        entitySet.getEntities().add(lineItem2);
        //Create the Lines LInk  
        ClientLink linesLink = factory.newDeepInsertEntitySet("Lines", entitySet);
        ClientComplexValue complexValueCreate = factory.newComplexValue("Lines");
        complexValueCreate.getNavigationLinks().add(linesLink);
        //Create the Item object
        ClientEntity item = factory.newEntity(new FullQualifiedName("ODATA.Item"));
    item.getProperties()
                .add(factory.newPrimitiveProperty("itemNumber", factory.newPrimitiveValueBuilder().buildString("ITEM1")));
        //Add the Lines(Entity Set) link to Item Object           
        item.addLink(linesLink);
        //Post the Item  
        URI absoluteUri = client.newURIBuilder("URL").build();
        ODataEntityCreateRequest<ClientEntity> request = client.getCUDRequestFactory()
                .getEntityCreateRequest(absoluteUri, item);
        request.setAccept("application/json;odata.metadata=minimal");
        request.execute();
 }    
 

You will have to specify the the NavigationPropertyName in the deep part. So for your sample payload it would look like

{
    "itemNumber": "ITEM1",
    
    "lines": {
        "componentNumber":"COMPONENT1",
        "componentNumber":"COMPONENT2",
         
    }
}

You can refer to this post in SO to get details about n level nesting

The above answer asuumes that your NavigationProperty is named lines, you can substitute it with the right name by looking at service/$metadata

The answer assumes that you are trying to do deep inserts in a odata2 service, for OData4 the concept remains the same but syntax might vary a bit. Please refer to the payload descripted in documentation in case of OData 4

Related