openapi生成器typescript-angular将数字添加到方法名称的末尾

问题描述

说明 我有一个来自Spring Boot服务器的公开文件 我正在使用此脚本生成一个打字稿角度客户端

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

系统中的api名称重复

简单的结构

Controller1:[获取,列表,删除......] Controller2:[获取,列表,删除......] .....

生成的类如下

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

但是功能在同一控制器中是唯一的,并且生成器仍在其中添加数字

openapi-generator版本 4.3.1使用npm cli

OpenAPI声明文件内容或URL 用于生成的命令行 openapi-generator-cli生成-g typescript-angular -i ./src/app/data/open-api.json -o ./src/app/data/build/openapi


那么有什么方法可以使这些数字消失?

更新后端时,内部数字可能会更改,这将导致手动代码重构

解决方法

来自 template 的数字来自“昵称”属性。

internals of OpenAPI 中,这是在生成 open-api.json 文件时根据 operationId 生成的。

Spring Boot 的解决方案(以及其他类似的,以适应...)是调整 operationId 生成 (original answer)。

为了让生成的代码仍然匹配一个通用接口(就像使用通用 Spring 控制器时一样), operationId 必须匹配一个引用(默认:处理方法名称)。 这是我使用的内容(ChangeController.class 是通用的,约占 API 的 80%)。

@Bean
public OperationCustomizer operationIdCustomizer() {
    return (operation,handlerMethod) -> {
        Class<?> superClazz = handlerMethod.getBeanType().getSuperclass();
        if (Objects.nonNull(superClazz) && 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>