sap-cloud-sdk - OData PATCH 请求导致 IllegalArgumentException
问题描述
从上周开始,我们开始使用 SDK 版本 3.34.1(并且还使用 3.35.0 进行了测试)。当我们向 SAP 服务发送 PATCH 请求时,我们会HTTP 204 No-Content
从 SAP 服务(SAP 网关)得到响应。当 SDK 尝试读取该响应时,它会尝试解析为空的响应正文。这会导致以下异常:
2020-12-17 16:13:51.767 ERROR 106363 --- [ut.sap.cases]-0] .s.c.s.d.o.c.r.ODataRequestResultGeneric :
Failed to buffer HTTP response. Unable to buffer HTTP entity.
java.lang.IllegalArgumentException: Wrapped entity may not be null
at org.apache.http.util.Args.notNull(Args.java:54)
at org.apache.http.entity.HttpEntityWrapper.<init>(HttpEntityWrapper.java:59)
at org.apache.http.entity.BufferedHttpEntity.<init>(BufferedHttpEntity.java:59)
at com.sap.cloud.sdk.datamodel.odata.client.request.ODataRequestResultGeneric.lambda$getHttpResponse$4f00ca4e$1(ODataRequestResultGeneric.java:180)
at io.vavr.control.Try.of(Try.java:75)
at com.sap.cloud.sdk.datamodel.odata.client.request.ODataRequestResultGeneric.getHttpResponse(ODataRequestResultGeneric.java:180)
at com.sap.cloud.sdk.datamodel.odata.client.request.ODataHealthyResponseValidator.requireHealthyResponse(ODataHealthyResponseValidator.java:44)
at io.vavr.control.Try.andThenTry(Try.java:250)
at com.sap.cloud.sdk.datamodel.odata.client.request.ODataRequestGeneric.tryExecute(ODataRequestGeneric.java:194)
at com.sap.cloud.sdk.datamodel.odata.client.request.ODataRequestGeneric.tryExecuteWithCsrfToken(ODataRequestGeneric.java:225)
at com.sap.cloud.sdk.datamodel.odata.client.request.ODataRequestUpdate.execute(ODataRequestUpdate.java:136)
at com.sap.cloud.sdk.datamodel.odata.helper.FluentHelperUpdate.executeRequest(FluentHelperUpdate.java:372)
at com.alliander.gvrn.pmd.adapter.out.sap.cases.SapCasesClient.updateCase(SapCasesClient.java:103)
at com.alliander.gvrn.pmd.adapter.out.sap.cases.SapCasesClient.persistOn(SapCasesClient.java:81)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at ....
我们使用生成的类型化 OData V2 客户端,这些客户端是通过根据 SDK 文档提供我们的 EDMX 文件生成的。
下面是调用服务的函数的代码片段。是一个自动生成的matrixCase
对象。SAP 服务正确处理 OData PATCH。
private void updateCase(final ExternalId caseId, final PMDFlow pmdFlow, String jwtToken) {
final HttpDestination sapMatrix = httpDestinationProvider.providePrincipalPropagationDestination(jwtToken);
// "Create matrixCase object with key
MatrixCase matrixCase = MatrixCase.builder()
.psReference(caseId.getValue())
.build();
// Set PmdAppControl explicitly, otherwise the generated client doesn't know which fields are updated.
matrixCase.setPMDAppControl(pmdFlow.getSapNotation());
try {
casesService
.updateMatrixCase(matrixCase)
.executeRequest(sapMatrix);
} catch (ODataException e) {
OdataLogger.logODataException(e);
throw new SapClientException(e);
}
}
由于其他问题,我们已经更新到 SDK 3.34.1,但是在我们使用 3.32.0 之前,我不记得在 3.32.0 版本中有这个问题
有任何想法吗?
丹尼
解决方案
是的,您的观察是正确的,即 204 代表有效答案,不值得记录错误。因此,Cloud SDK 团队将调整日志条目级别以降低令人担忧的程度。
问候,坦维
推荐阅读
- c - 如何访问作为参数传递给c中函数的char数组的元素?
- java - Google App Engine servlet 只能在 localhost 上访问
- sql - 将 CTE 和 UNION ALL 与 SQL Server 2014 一起使用
- php - PHP时间(小时和分钟)未正确添加
- keystonejs - PM2 无法启动梯形校正
- python - Python - SQLite:更新两条具有相同标识值的记录
- android - 弹出窗口不显示?
- c++ - An error with Floating Point Exception C++ expression
- docker - 如何使用命令行向 Apache Fuseki 添加新数据集?
- javascript - 谷歌浏览器调用 JS 脚本控制台?