генератор openapi typescript-angular добавляет числа в конец имен методов

#angular #typescript #openapi-generator

#angular #typescript #openapi-генератор

Вопрос:

Описание У меня есть открытый файл с сервера spring boot, и я использую этот скрипт для создания клиента typescript angular

openapi-generator-cli generate -g typescript-angular -i ./src/app/data/open-api.json -o ./src/app/data/build/openapi

в системе есть дублированные имена API

простая структура

Контроллер 1: [получить, список, удалить, … ….] Контроллер 2: [получить, список, удалить, … ….] …..

сгенерированные классы выглядят следующим образом

 Controller1Service{
public get1 ....
public list1 .....
}
Controller2Service{
public get2 ....
public list2 .....
}
  

но функции уникальны в одном контроллере, и генератор все еще добавляет к ним числа

openapi-генератор версии 4.3.1 с использованием npm cli

Содержимое файла объявления OpenAPI или командная строка url, используемая для генерации openapi-generator-cli generate -g typescript-angular -i ./src/app/data/open-api.json -o ./src/app/data/build/openapi


Итак, есть ли способ заставить эти числа исчезнуть?

при обновлении серверной части номера могут быть изменены внутри, и это приведет к ручному рефакторингу кода

Ответ №1:

В шаблоне числа берутся из атрибута ‘nickname’.

Во внутренних компонентах OpenAPI это создается из OperationId при создании файла open-api.json.

Решение для Spring Boot (и других подобных, для адаптации …) заключается в настройке генерации OperationId (оригинальный ответ).

Чтобы сгенерированный код по-прежнему соответствовал общему интерфейсу (как при использовании универсальных контроллеров Spring), идентификатор операции должен соответствовать ссылке (по умолчанию: имя метода обработки).). Вот что я использовал (ChangeController.class является универсальным и составляет около 80% API).

 @Bean
public OperationCustomizer operationIdCustomizer() {
    return (operation, handlerMethod) -> {
        Class<?> superClazz = handlerMethod.getBeanType().getSuperclass();
        if (Objects.nonNull(superClazz) amp;amp; superClazz.isAssignableFrom(ChangeController.class)) {
            operation.setOperationId(String.format("%s", handlerMethod.getMethod().getName()));
        }
        return operation;
    };
}
  

ВАЖНОЕ ПРИМЕЧАНИЕ: это приведет к возникновению ошибки при проверке спецификации при создании клиента Angular, отключите проверку явно (skipValidateSpec).

Кроме того, для генерации, работающей с Angular 10 , требуется openapi-generator 5.0.0 (для универсальных ModuleWithProviders).

 <plugin>
    <groupId>org.openapitools</groupId>
    <artifactId>openapi-generator-maven-plugin</artifactId>
    <version>5.0.0</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <inputSpec>${project.basedir}/../sic-frontend/src/app/api/openapi.json</inputSpec>
                <generatorName>typescript-angular</generatorName>
                <output>${project.basedir}/../sic-frontend/src/app/api</output>
                <skipValidateSpec>true</skipValidateSpec>
                <configOptions>
                    <ngVersion>10.0.0</ngVersion>
                </configOptions>

            </configuration>
        </execution>
    </executions>
</plugin>