I generated an ODATA v4 client for the SAP S/4HANA Sourcing Project API like described here.
All in all it works quite well. I can query, update or delete sourcing project data, milestones and contacts using batch requests, e.g. like this:
OPSOURCINGPROJECT0001Service sourcingProjectService = new DefaultOPSOURCINGPROJECT0001Service()
.withServicePath("/sap/opu/odata4/sap/api_sourcingproject/srvd_a2x/sap/sourcingproject/0001");
BatchRequestBuilder batchRequestBuilder = sourcingProjectService.batch();
batchRequestBuilder.addChangeset(sourcingProjectService.deleteSourcingProjectContact(sapContact1));
batchRequestBuilder.addChangeset(sourcingProjectService
.updateSourcingProjectContact(sapContact).includingFields(Contact.BUSINESS_PARTNER));
batchRequestBuilder.addChangeset(sourcingProjectService
.updateSourcingProject(sourcingProject).includingFields(SourcingProject.PURCHASER_RESPONSIBLE));
BatchResponse batchResponse = batchRequestBuilder
.withHeader("prefer", "odata.continue-on-error")
.withQueryParameter("saml2", "disabled")
.execute(destination);
However I can't figure out, how to create a new contact like it is described for the javascript version of the client, see here.
How can I do that in a batch request? There is no createSourcingProjectContact
-method in the generated service-class.
I tried to use the CreateRequestBuilder
directly cheating a bit like this:
private CreateRequestBuilder<Contact> createSourcingProjectContact(SourcingProject sourcingProject, Contact sapContact) {
String servicePath = config.getSapServicePathSourcingProject();
String resourceEntity = "SourcingProject(" + sourcingProject.getSourcingProjectUUID() + ")/_SourcingProjectContact";
return new CreateRequestBuilder<>(servicePath, sapContact, resourceEntity);
}
But when I add the result to the batch using the batchRequestBuilder
it will escape the URI of the corresponding post request and transform (
to %28
for example which renders that part of the batch request invalid as far as the SAP-partner-system is concerned.
It also does not work to send the create-requests outside of a batch, since still the SDK will encode the '/' in the 'resourceEntity' and such in the resulting URI.
Any help would be highly appreciated, since it is a pressing matter. :-)
Please use the forEntity
API and pass it on to the BatchRequestBuilder
after the create request of sourcing project data.
sourcingProjectService.forEntity( sourcingProject ) // The project to which contact should be added.
.navigateTo( theNavigationPropety ) // Should be something like SourcingProject.TO_SOURCING_PROJECT_CONTACT
.create( contact ); //Supply your contact object here