使用最新的Java SAP Cloud Sdk
我们正在尝试对S / 4系统中的OutboundDelivery进行更新。我们正在使用API_OUTBOUND_DELIVERY_SRV版本2。该服务要求我们使用etag,即它要求我们提供标头- 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.
我的问题:
请注意,由于性能原因,我们必须使用批处理操作本身。
缺少ETag,因为要更新的项目是使用生成器模式在您的应用程序中以编程方式创建的。因此,当您执行更新时,它们上将不存在任何ETag,并且在构建请求时,SDK将没有可用的ETag来设置“ If-Match”标头。
解决方案是首先从服务器获取项目。这还可以确保您具有更新的最新版本,这是更新它们的先决条件。
感谢您的回答@MatKuhr。实际上,我们必须更新很多项目(约1000个项目)。由于性能原因,我们首先阅读太多项目效率不高。另外,Java SDK截至目前还没有通过VDM提供批处理读取功能(如果我错了,请纠正我)。除此之外,SDK是否始终要求我先阅读一项然后进行更新?是否有可能仅使用给定密钥更新项目?
您可以使用
getAllOutbDeliveryItem()
服务公开的方法获取所有项目。这将获取带有正确etag的所有项目。首先无法进行任何获取,因为您需要获取最新的ETag才能执行更新或删除操作。非常感谢你。结合
getAllOutbDeliveryItem()
与filter()
一个特定的属性,我能够限制响应,并得到的ETag了。谢谢!大!您能否将答案标记为已接受,以便其他人更容易看到?