首页 > 解决方案 > 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 版本中有这个问题

有任何想法吗?

丹尼

标签: sap-cloud-sdk

解决方案


是的,您的观察是正确的,即 204 代表有效答案,不值得记录错误。因此,Cloud SDK 团队将调整日志条目级别以降低令人担忧的程度。

问候,坦维


推荐阅读