openapi - 如何更改“APIClient”名称
问题描述
我正在尝试从 swagger-codegen-maven-plugin(版本 3.0.8)和(组 ID:io.swagger.codegen.v3)自动生成类,如下所示。代码生成效果很好,但是我想将 Generated ApiClient 的名称更改为 PREFIX+ApiClient 之类的名称(例如:customApiClient,其中 custom 是前缀)。
<build>
<finalName>cdm-customer-servicing-api-client</finalName>
<plugins>
<plugin>
<!-- This 2019 version is required for OpenAPI 3 -->
<groupId>io.swagger.codegen.v3</groupId>
<artifactId>swagger-codegen-maven-plugin</artifactId>
<version>3.0.8</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>${project.basedir}/src/main/resources/spec.json</inputSpec>
<language>java</language>
<apiPackage>*****.client.api</apiPackage>
<modelPackage>*******. client.model</modelPackage>
<configOptions>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<artifactVersion>${project.version}</artifactVersion>
<library>resttemplate</library>
<java8>true</java8>
<dateLibrary>java8</dateLibrary>
<licenseName>Apache 2.0</licenseName>
<licenseUrl>https://www.apache.org/licenses/LICENSE-2.0</licenseUrl>
</configOptions>
<additionalProperties>
<property></property>
</additionalProperties>
<generateApiTests>false</generateApiTests>
<generateModelTests>false</generateModelTests>
<generateApiDocumentation>false</generateApiDocumentation>
<generateModelDocumentation>false</generateModelDocumentation>
</configuration>
</execution>
</executions>
</plugin>
上面的定义生成模型,在 YML 规范中指定的 api,没有问题。它还生成在所有 API 类中自动装配的 ApiClient.java。我想更改 ApiClient.java 的名称以添加一些前缀或后缀。
原因是:我确实有 2 个服务规范,我想确保来自一个服务的 ApiClient 不会覆盖另一个 ApiClient。
让我知道是否有人有运气。
解决方案
可以实现一个扩展的自定义生成器JavaClientCodegen.java
。
- 创建一个具有这种结构的项目(名称由您决定)。可以使用创建骨架
./gradlew clean openApiMeta
(找不到 mvn 等效项)
src/
└── main
├── java
│ └── org
│ └── openapitools
│ └── codegen
│ └── CustomJavaGenerator.java
└── resources
├── customjava
│ └── CustomApiClient.mustache
└── META-INF
└── services
└── org.openapitools.codegen.CodegenConfig
- CustomJavaGenerator.java
public class CustomJavaGenerator extends JavaClientCodegen implements CodegenConfig {
private final Logger LOGGER = LoggerFactory.getLogger(JavaClientCodegen.class);
private static final String CUSTOM_API_CLIENT_PREFIX = "customApiClientPrefix";
@Override
public void processOpts() {
super.processOpts();
final String invokerFolder = (sourceFolder + '/' + invokerPackage).replace(".", "/");
String customPrefix = "DefPref";
if (additionalProperties.containsKey(CUSTOM_API_CLIENT_PREFIX)) {
customPrefix = additionalProperties.get(CUSTOM_API_CLIENT_PREFIX).toString();
LOGGER.warn("client custom name: " + customPrefix + "ApiClient.java" );
}
supportingFiles.removeIf(e -> "ApiClient.java".equals(e.getDestinationFilename()));
supportingFiles.add(new SupportingFile("CustomApiClient.mustache", invokerFolder, customPrefix + "ApiClient.java"));
}
@Override
public String getName() {
return "javaCustom";
}
}
- 资源/META-INF/services/org.openapitools.codegen.CodegenConfig
org.openapitools.codegen.CustomJavaGenerator
- 下载 此文件并替换(区分大小写)
resources/customjava/CustomApiClient.mustache
的每个实例,如图所示ApiClient
public class {{customApiClientPrefix}}ApiClient { ...
打包并安装项目,使其在 mavenLocal 存储库中显示为例如
customjava-openapi-generator-1.0.0.jar
.在这种情况下,使用 gradle生成代码。
将自定义 jar 添加到类路径,并将openApiGenerate
配置添加到 gradle.build。maven应该是类似的。
buildscript {
repositories {
mavenLocal()
jcenter()
maven { url "https://repo1.maven.org/maven2" }
}
dependencies {
// other dependencies
// custom generator
classpath "org.openapitools:customjava-openapi-generator:1.0.0"
classpath "org.openapitools:openapi-generator-gradle-plugin:5.1.0"
}
}
repositories {
jcenter()
}
apply plugin: 'org.openapi.generator'
openApiGenerate {
//verbose = true
generatorName = "javaCustom"
inputSpec = "$rootDir/generate/proj-swa01-1.0.0-resolved.yaml".toString()
outputDir = "$buildDir/generated".toString()
apiPackage = "org.openapi.example.api"
invokerPackage = "org.openapi.example.invoker"
modelPackage = "org.openapi.example.model"
templateDir = "customjava"
configOptions = [
dateLibrary: "java8"
]
additionalProperties = [
customApiClientPrefix: "Swa"
]
}
- 摇篮命令:
/gradlew clean openApiGenerate
推荐阅读
- flutter - 参数类型“对象?” 不能分配给参数类型“列表”
' - node.js - JavaScript 点符号在 process.env 中不起作用
- json - 为什么 Newtonsoft 在 F# 中将缺少的整数字段转换为其默认值?
- spring-boot - SpringBoot - Metrics for HTTP response status code for Grafana dashboard
- python - How to get name instead of id in django queryset
- javascript - 打字稿中主类中的访问方法
- java - java GET / HTTP/1.1中的错误,127.0.0.1拒绝连接
- php - 从 WooCommerce 中具有特定标签的产品中获取购物车商品数量
- c# - RuntimeBinderException:登录后无法对空引用执行运行时绑定
- c++ - 交叉编译到 Linux 时如何在 Visual Studio 中添加包含目录?