使用最新的java SAP Cloud
我们试图在S/4系统中执行对OutboundDelivery的更新。我们使用的是API_OUTBOUND_DELIVERY_SRV版本2。服务要求我们使用etag,也就是说,它要求我们提供具有etag对应值的头- if-match。
我们使用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.我的问题:
请注意,由于性能原因,我们必须使用批处理操作本身。
发布于 2020-02-05 09:52:33
缺少ETags是因为要更新的项是通过编程方式使用构建器模式在应用程序中创建的。因此,在执行update时,它们上没有ETags,而且在构建请求时,SDK无法设置"If-Match“标头。
解决方案是先从服务器获取项目。这还确保您有更新的最新版本,这是更新它们的先决条件。
发布于 2020-02-04 11:42:37
首先,我对您正在使用的的哪个版本感到困惑。您在第一个问题中提到了JavaScript,但是com.sap.cloud.sdk.s4hana是一个Maven包标识符,即Java。你能澄清一下你用的是哪种版本吗?
或者,这两个版本都应该自动为您处理这个问题。我假设您正在尝试执行某种类型的写请求(更新或删除),从而生成您在这里发布的错误消息。当然,为了发送带有这样一个请求的eTag,必须事先知道当前的eTag。在执行写入请求之前,是否获取了实体的最新状态?
最后,JavaScript SDK允许您忽略相应请求生成器上的ignoreVersionIdentifier方法的版本标识符。当然,这通常是不推荐的!因此,在决定是否可以忽略它之前,一定要了解为什么需要使用eTag。最后,还有withCustomHeader,您可以在这里提供自己的eTag头,如果出于任何原因,上述方法都不适合您。
https://stackoverflow.com/questions/60055957
复制相似问题