DOS
DOS

Reputation: 41

How to create a deep insert structure using Olingo Client?

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"
    } 
] 
} 

Upvotes: 1

Views: 349

Answers (2)

DOS
DOS

Reputation: 41

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();
 }    
 

Upvotes: 1

Shiva
Shiva

Reputation: 6885

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

Upvotes: 0

Related Questions