E-Tag 在 SAP Cloud SDK VDM 中处理 odatav2

E-Tag handling for odatav2 in SAP Cloud SDK VDM

使用最新的 java SAP Cloud Sdk

我们正在尝试对 S/4 系统中的 OutboundDelivery 执行更新。我们为此使用 API_OUTBOUND_DELIVERY_SRV 版本 2。该服务要求我们使用etag,即它要求我们提供一个header - if-match 与etag 对应的值。

我们正在使用 VDM 执行更新并正在使用 com.sap.cloud.sdk.s4hana.datamodel.odata.namespaces.outbounddeliveryv2.batch.OutboundDeliveryV2ServiceBatch。请在下面找到用于更新的代码片段:

...
OutboundDeliveryV2ServiceBatch service = // Instantiate service;

List<OutbDeliverItem> itemsToUpdate = new ArrayList<>();

items.add(OutbDeliveryItem.builder()
            .deliveryDocument("some key")
            .deliveryDocumentItem("some key")
            .build());

// Assume more additions to items
...
...
...

OutboundDeliveryV2ServiceBatchChangeSet changeSet = service.beginChangeSet();

items.forEach(changeSet::updateOutbDeliveryItem);

changeSet.endChangeSet();

BatchResponse response = service.execute(someDestination);
...

一旦执行 service.execute(someDestination),就不会在 S/4 上执行更新并且 S/4 上的日志会给出以下错误:

The Data Service Request is required to be conditional. Try using the "If-Match" header.

我的问题:

  1. 为什么 VDM/SDK 不处理内部的 etag 处理?根据 the section Optimistic concurrency control in this blog,提到它在 javascript sdk 中自动处理,但是 java sdk 呢?
  2. 是否可以通过某种方式使用 VDM 传递此 header?如果是那么怎么办?
  3. 或者我们是否必须在 S/4 中放弃我们服务的乐观并发控制?

请注意,由于性能原因,我们必须使用批处理操作本身。

首先,我不清楚您使用的是哪个版本的 SAP Cloud SDK。您在第一个问题中提到 JavaScript,但 com.sap.cloud.sdk.s4hana 是 Maven 包标识符,即 Java。能否说明一下您使用的是哪个版本?

要么,两个版本都应该自动为您处理这个问题。我假设您正在尝试执行某种写入请求(UPDATE 或 DELETE),该请求会产生您在此处发布的错误消息。当然,为了发送带有此类请求的 eTag,必须事先知道当前的 eTag。在执行写入请求之前,您是否已获取实体的最新状态?

最后,JavaScript SDK 允许您在相应的请求生成器上使用 ignoreVersionIdentifier 方法忽略版本标识符。一般当然不推荐这样!因此,在决定是否可以忽略它之前,请务必了解为什么需要 eTag。最后,还有 withCustomHeader 如果上述方法出于某种原因 none 适合您,您可以在其中提供自己的 eTag header。

缺少 ETag,因为要更新的项目是使用构建器模式在您的应用程序中以编程方式创建的。因此,当您执行更新时,它们上没有 ETag,并且 SDK 在构建请求时有 none 可用于设置 "If-Match" header。

解决方法是先从服务器获取项目。这也确保您拥有最新版本的更新,这是更新它们的先决条件。