Java SDK игнорирует свойство sap-client Destionation для запроса метаданных - PullRequest
1 голос
/ 30 января 2020

Я использую Java SAP Cloud SDK версии 3.11.0 и имею следующий запрос VDM:

final Destination destination = DestinationAccessor.getDestination("MyDestination");

Try<OutbDeliveryHeader> deliveryHeaderTry = Try.of(() -> new DefaultOutboundDeliveryV2Service()
                    .getOutbDeliveryHeaderByKey(deliveryDocument)
                    .execute(destination.asHttp()))
                    .onFailure(e -> logger.error("Failed to read delivery header " + deliveryDocument
                            + ": " + e.getMessage(), e));

Мне нужно, чтобы этот запрос был выполнен для системы, настроенной в «MyDestination» с указать c клиент SAP. Поэтому я добавил дополнительное свойство sap-client с соответствующим значением в пункте назначения.

К сожалению, однако, этот запрос возвращает следующую ошибку:

Unable to fetch the metadata : Failed to execute OData Metadata request.

При отладке SDK я обнаружил, что метод getEdm из com.sap.cloud.sdk.odatav2.connectivity.cache.metadata.GuavaMetadataCache никогда не добавляет информацию sap-client как либо HTTP-заголовок, либо параметр URL-адреса для запроса метаданных. (Используя Postman, я смог показать, что для запроса метаданных действительно требуется sap-client, в противном случае он не выполняется. Это объясняет, почему запрос VDM не выполняется в первую очередь. )

Теперь у меня вопрос, является ли это предполагаемым поведением или ошибкой в ​​SDK?

Я подумал, что использование .withHeader("sap-client","600").onRequestAndImplicitRequests() в моем запросе VDM решает мою проблему, но если я должен добавьте эту информацию к каждому запросу VDM, тогда почему я должен установить sap-client в пункте назначения?

Или запрос метаданных OData предназначен для "agnosti c клиента", и именно поэтому sap-client не добавлено в запрос метаданных в SDK?

1 Ответ

3 голосов
/ 31 января 2020

Поскольку вы подключаетесь к службе OData S / 4 , запрос ожидает дополнительные заголовки HTTP. Пользовательские значения для sap-client и sap-locale могут быть установлены вручную (как описано в вашем вопросе). Или вы можете использовать следующий код:

HttpDestination destination =
  DestinationAccessor.getDestination("MyDestination").asHttp()
    .decorate(DefaultErpHttpDestination::new);

[...]
new DefaultOutboundDeliveryV2Service()
  .getOutbDeliveryHeaderByKey(deliveryDocument)
  .execute(destination));

При использовании этого дополнительного шага «декорирования» для типа HttpDestination целевому объекту автоматически предоставляются свойства со вкусом S / 4 как описано выше. Например, значение для sap-client, сохраненное в вашей службе назначения, будет добавлено по умолчанию, без необходимости вручную вызывать .withHeader(...).onRequestAndImplicitRequests().

Я описал контекст в следующем ответе SO: { ссылка }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...