You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:12:35