VDM работает для одного сервиса Odata, не работает для другого - PullRequest
0 голосов
/ 26 марта 2019

Я пытался использовать S4 SDK для подключения к службе S / 4 HANA Odata. Команда S / 4 предоставила нам две услуги. При одинаковом назначении работает похожий код, интеграция с одним сервисом работает, с другим - нет.

С наилучшими пожеланиями

Ин

код используется

final List<User> userList = new DefaultS4cUserMetadataService()
        .getAllUser()
        .select(
            User.USER, 
            User.BUSINESS_UNIT,
            User.COMPANY,
            User.COST_CENTER) 
        .filter(
            User.TIME_STAMP.ge(LocalDateTime.of(1970, Month.JANUARY, 1, 0, 0, 0)))
        .orderBy(User.USER, Order.ASC)
        .execute(configContext);
return userList;

Я также звонил без выбора и фильтра, но получала ту же ошибку: Внутренняя ошибка с кодом 500. Но для службы, чтобы получить бизнес-роль, это работало. Код, используемый для получения бизнес-роли:

final List<IAGBusinessRoleView> businessRoleList =
        new DefaultS4cBusinessRoleMetadataService()
            .getAllIAGBusinessRoleView()
            .select(
                IAGBusinessRoleView.BUS_ROLE_ID,
                IAGBusinessRoleView.USER_NAME,
                IAGBusinessRoleView.UUID,
                IAGBusinessRoleView.DESCRIPTION,
                IAGBusinessRoleView.TIME_STAMP,
                IAGBusinessRoleView.LANGUAGE_KEY)
            .orderBy(IAGBusinessRoleView.BUS_ROLE_ID, Order.ASC)
            .execute(configContext);
return businessRoleList;

Он использовал тот же пункт назначения.

1 Ответ

1 голос
/ 01 апреля 2019

После рассмотрения проблемы мы обнаружили, что служба S / 4HANA в фоновом режиме не работает должным образом.

Дальнейшие ссылки. Я опишу способ понять, что происходит под капотом OData VDM.


Отображение HTTP-вызовов

Чтобы увидеть, какие HTTP-запросы выполняет OData VDM, мы создадим тест, который устанавливает и отключает локальный фиктивный сервер, на который будут отправляться запросы. Для этого мы используем Wiremock .

Предпосылки

Единственным предварительным условием для этого является загрузка файла метаданных службы, с которой вы хотите проверить. Вы можете получить это, используя конечную точку $metadata вашей целевой системы.

Для PhysicalInventoryDocumentService это может выглядеть примерно так:

https://myserver.com/sap/opu/odata/sap/API_PHYSICAL_INVENTORY_DOC_SRV/$metadata

Путь можно найти в сервисном интерфейсе вашего сервиса для проверки. В этом примере вы найдете его в PhysicalInventoryDocumentService:

public interface PhysicalInventoryDocumentService
{
    // ...
    String DEFAULT_SERVICE_PATH = "/sap/opu/odata/sap/API_PHYSICAL_INVENTORY_DOC_SRV";
    // ...
}

Настройка теста

Создайте нормальный тестовый класс внутри вашей тестовой директории (SomeTest в этом примере).

Переместите файл метаданных, который вы загрузили на предыдущем шаге, в каталог ресурсов-тестов в подкаталоге, названном после теста. Так что в моем примере у меня есть следующая структура: src->test->resources->SomeTest->API_PHYSICAL_INVENTORY_DOC_SRV.edmx.

В вашем тестовом классе добавьте следующие строки на уровне класса:

private static final MockUtil mockUtil = new MockUtil();
@Rule
public final WireMockRule erpServer = mockUtil.mockErpServer();

Это будет для каждого метода тестирования настроить фиктивный сервер, выполнить код и, наконец, снова отключить сервер. MockUtil можно найти в библиотеке com.sap.cloud.s4hana:testutil S / 4HANA Cloud SDK.

Затем добавьте следующий setUp метод:

@Before
public void setUp()
{
    final String metadataAsString =
        TestUtil.readResourceFile(SomeTest.class, "API_PHYSICAL_INVENTORY_DOC_SRV.edmx");
    stubFor(
        get(urlEqualTo("/sap/opu/odata/sap/API_PHYSICAL_INVENTORY_DOC_SRV/$metadata"))
            .willReturn(okXml(metadataAsString)));
}

Там вам нужно заменить имя класса, имя файла метаданных и URL-адрес вашего сервиса. Эти строки сообщат фиктивному серверу вернуть метаданные, если запрос получен по указанному URL. Поскольку это первый шаг при каждом вызове OData VDM, его необходимо смоделировать.

Теперь создайте метод теста следующим образом:

@Test
public void testSomething()
    throws ODataException
{
    new DefaultPhysicalInventoryDocumentService().getAllPhysInventoryDocItem().execute();
}

Вам необходимо заменить вызов на тот, который вы хотите на самом деле проверить / подтвердить.

Выполнить тест

Если вы запустите тест, вы получите сообщение об ошибке, содержащее следующую таблицу:

[qtp1038820134-18] ERROR WireMock - 
                                               Request was not matched
                                               =======================

-----------------------------------------------------------------------------------------------------------------------
| Closest stub                                             | Request                                                  |
-----------------------------------------------------------------------------------------------------------------------
                                                           |
GET                                                        | GET
/sap/opu/odata/sap/API_PHYSICAL_INVENTORY_DOC_SRV/$metada  | /sap/opu/odata/sap/API_PHYSICAL_INVENTORY_DOC_SRV/A_PhysI<<<<< URL does not match
ta                                                         | nventoryDocItem?$format=json
                                                           |
                                                           |
-----------------------------------------------------------------------------------------------------------------------

Это обычный ответ Wiremock, если сервер получил запрос, который не был проверен. Слева вы видите ближайший смоделированный запрос, а справа - фактически полученный запрос.

Теперь вы можете использовать запрос справа через Почтальон или через браузер и напрямую проверить поведение.

...