Запрос ИСПРАВЛЕНИЯ OData приводит к исключению IllegalArgumentException

#sap-cloud-sdk

#sap-cloud-sdk

Вопрос:

С прошлой недели мы начали использовать SDK версии 3.34.1 (а также протестировали это с 3.35.0). Когда мы отправляем запрос на ИСПРАВЛЕНИЕ в службу SAP, мы получаем 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, который создается путем предоставления наших файлов EDMX в соответствии с документацией SDK.

Ниже приведен фрагмент кода функции, вызывающей службу. Это matrixCase автоматически созданный объект. ИСПРАВЛЕНИЕ OData правильно обрабатывается службой SAP.

 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

Есть идеи?

Дэнни

Комментарии:

1. Привет, Дэнни, это исключение выдается или оно только регистрируется? Мы видим, что облачный sdk регистрирует это как ошибку, поэтому это приводит к неправильным толкованиям, но это предполагаемое поведение, и cloud sdk адаптирует уровень журнала, чтобы исправить путаницу. Поэтому, если он не выбрасывается, я говорю, что все в порядке.

2. Я на самом деле не знаю. Он выбрасывается / регистрируется перед оператором catch в нашем коде. И если это нормальное поведение, зачем вообще регистрировать его. И зачем тогда регистрировать это как ошибку и исключение недопустимого аргумента?

3. На мой взгляд, проверяющий ODataHealthyResponseValidator должен учитывать ответы HTTP 204 без содержимого. Поскольку они полностью нормальны в соответствии со спецификациями OData V2. Зачем пытаться анализировать тело ответа, если статус HTTP уже говорит вам, что тела нет

Ответ №1:

Да, ваше замечание верно, что 204 представляет собой правильный ответ и не стоит регистрировать ошибку. Следовательно, команда Cloud SDK настроит уровень входа в журнал, чтобы он был менее тревожным.

С уважением, Tanvi

Комментарии:

1. На основе sap.github.io/cloud-sdk/docs/java /… новая версия 3.36.0 должна была быть выпущена 4 дня назад. Однако он недоступен в maven central. Когда это будет доступно?

2. Произошла небольшая задержка, но версия доступна в maven central с 19 января. github.wdf.sap.corp/cloudsdk/sdk-core/issues /331