#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>