如何用SAP Cloud SDK及生成的OData v4客户端创建寻源项目联系人?
问题描述
我基于SAP S/4HANA Sourcing Project API生成了OData v4客户端,目前能通过批量请求完成寻源项目、里程碑、联系人的查询、更新、删除操作,示例代码如下:
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);
但生成的服务类里没有createSourcingProjectContact方法,无法像JS版本客户端那样创建新联系人。我尝试手动用CreateRequestBuilder实现:
private CreateRequestBuilder<Contact> createSourcingProjectContact(SourcingProject sourcingProject, Contact sapContact) { String servicePath = config.getSapServicePathSourcingProject(); String resourceEntity = "SourcingProject(" + sourcingProject.getSourcingProjectUUID() + ")/_SourcingProjectContact"; return new CreateRequestBuilder<>(servicePath, sapContact, resourceEntity); }
但添加到批量请求后,POST请求的URI会被转义(比如(变成%28),SAP系统无法识别;即使单独发送请求,SDK也会编码/等字符,导致请求无效。求解决办法。
解决方案
1. 重新生成客户端,确保包含关联实体的创建方法
首先排查客户端生成配置,大概率是生成时未包含导航属性的CRUD方法。如果使用SAP Cloud SDK Generator,需确保:
- 生成命令默认包含所有实体及导航属性,或显式指定需要的关联关系
- 检查EDMX文件,确认
SourcingProject与Contact间的导航属性_SourcingProjectContact存在且支持创建操作
重新生成后,服务类会自动生成createSourcingProjectContact方法,直接加入批量请求即可:
// 使用自动生成的创建方法 batchRequestBuilder.addChangeset( sourcingProjectService.createSourcingProjectContact(sapContact, sourcingProject.getSourcingProjectUUID()) );
2. 利用SDK导航属性构建正确请求
若无法重新生成客户端,不要手动拼接URI,用SDK提供的导航属性API构建请求,避免错误转义:
// 通过寻源项目的导航属性构建联系人创建请求 CreateRequestBuilder<Contact> createRequest = sourcingProjectService .sourcingProject(sourcingProject.getSourcingProjectUUID()) ._sourcingProjectContact() .create(sapContact); // 将请求加入批量变更集 batchRequestBuilder.addChangeset(createRequest);
这种方式由SDK自动处理URI的构建与编码,完全符合OData规范,SAP系统可正常识别。
3. 手动构建时使用SDK URI工具类
如果必须手动构建请求,使用SAP Cloud SDK的UriFactory生成标准URI,替代字符串拼接:
import com.sap.cloud.sdk.datamodel.odata.client.uri.UriFactory; private CreateRequestBuilder<Contact> createSourcingProjectContact(SourcingProject sourcingProject, Contact sapContact) { String servicePath = config.getSapServicePathSourcingProject(); // 用UriFactory构建符合规范的导航路径 String navigationPath = UriFactory.createNavigationPath( "SourcingProject", sourcingProject.getSourcingProjectUUID(), "_SourcingProjectContact" ); return new CreateRequestBuilder<>(servicePath, sapContact, navigationPath); }
该方法会按照OData标准处理URI编码,避免不必要的转义,确保请求被SAP系统正确解析。
内容的提问来源于stack exchange,提问作者Fencer
相关产品推荐
相关产品推荐

