是否可以为生成的 openApi 规范文件设置特定的包名称
Is it possible to set specific package name for generated openApi spec file
在我们的项目(java/spring/gradle 堆栈)中,我们使用的是 openApi 规范。我们为他们提供了一些服务和规格。此外,我们在每个规范中都有重复的通用模块。我们将这些通用模块移动到一个单独的规范文件中,并将它们包含在其他文件中。例如:
specific_project1:
openapi:
spec.yaml
common_modules.yaml
build.gradle
spec.yaml
有下一个代码:
openapi: 3.0.0
info:
version: 0.0.1
paths:
/specific/post:
post:
requestBody:
context:
application/json:
schema:
$ref: "common_modules.yaml#/components/schemas/TestModule"
和下一个common_modules.yaml
:
openapi: 3.0.0
info:
version: 0.0.1
components:
schemas:
TestModule:
type: object
properties:
value:
type: string
因此,我们需要用包名com.specific.project1
生成spec.yaml
,用包名com.common.modules
生成common_modules.yaml
,生成的[=31] =] class 从 spec.yaml
生成的 TestModule
在导入中包含包 com.common.modules
的导入。
有可能
当你添加openapi插件到build.grade like
plugins {
id "org.openapi.generator" version "4.3.0"
}
您将有权访问 openApiGenerate 任务,
可以这样修改,例如:
openApiGenerate {
generatorName = "jaxrs-jersey"
inputSpec = "$rootDir/spec-v1.yaml".toString()
outputDir = "$rootDir/".toString()
apiPackage = "name.of.api.package.rest.server.v1.api"
invokerPackage = "name.of.api.package.rest.server.v1.invoker"
modelPackage = "name.of.api.package.rest.server.v1.model"
configOptions = [
library: "jersey2"
]
}
这里是 link,您可以对 spring 进行所有可能的修改,例如 https://github.com/OpenAPITools/openapi-generator/blob/master/docs/generators/spring.md
以及生成器的完整列表:https://github.com/OpenAPITools/openapi-generator/tree/master/docs/generators
为了在单个项目中使用 2 个 yaml 文件,您必须这样做。
task common(type: org.openapitools.generator.gradle.plugin.tasks.GenerateTask){
generatorName = "spring"
inputSpec = "$rootDir//schema/common.yaml".toString()
outputDir = "$rootDir/generated".toString()
apiPackage = "com.abc.code.generated.controller"
modelPackage = "com.abc.code.generated.model"
configOptions = [
dateLibrary: "java8"
]
systemProperties = [
invoker : "false",
generateSupportingFiles: "true"
]
additionalProperties = [
interfaceOnly : "true",
]
您可以为 spec.yaml 保留 openApiGenerate
但一定要加上
compileJava.dependsOn common , tasks.openApiGenerate
所以你会同时执行它们。
希望我能帮到你。
我们找到了如何引用同一对象的解决方案。我们将 TestModule
作为一个单独的项目发布,它有自己的包,在其他项目中,我们使用 importMappings
配置来为对象定义正确的包名称。
importMappings = [
TestModule: "com.common.modules.TestModule"
]
在我们的项目(java/spring/gradle 堆栈)中,我们使用的是 openApi 规范。我们为他们提供了一些服务和规格。此外,我们在每个规范中都有重复的通用模块。我们将这些通用模块移动到一个单独的规范文件中,并将它们包含在其他文件中。例如:
specific_project1:
openapi:
spec.yaml
common_modules.yaml
build.gradle
spec.yaml
有下一个代码:
openapi: 3.0.0
info:
version: 0.0.1
paths:
/specific/post:
post:
requestBody:
context:
application/json:
schema:
$ref: "common_modules.yaml#/components/schemas/TestModule"
和下一个common_modules.yaml
:
openapi: 3.0.0
info:
version: 0.0.1
components:
schemas:
TestModule:
type: object
properties:
value:
type: string
因此,我们需要用包名com.specific.project1
生成spec.yaml
,用包名com.common.modules
生成common_modules.yaml
,生成的[=31] =] class 从 spec.yaml
生成的 TestModule
在导入中包含包 com.common.modules
的导入。
有可能
当你添加openapi插件到build.grade like
plugins {
id "org.openapi.generator" version "4.3.0"
}
您将有权访问 openApiGenerate 任务,
可以这样修改,例如:
openApiGenerate {
generatorName = "jaxrs-jersey"
inputSpec = "$rootDir/spec-v1.yaml".toString()
outputDir = "$rootDir/".toString()
apiPackage = "name.of.api.package.rest.server.v1.api"
invokerPackage = "name.of.api.package.rest.server.v1.invoker"
modelPackage = "name.of.api.package.rest.server.v1.model"
configOptions = [
library: "jersey2"
]
}
这里是 link,您可以对 spring 进行所有可能的修改,例如 https://github.com/OpenAPITools/openapi-generator/blob/master/docs/generators/spring.md
以及生成器的完整列表:https://github.com/OpenAPITools/openapi-generator/tree/master/docs/generators
为了在单个项目中使用 2 个 yaml 文件,您必须这样做。
task common(type: org.openapitools.generator.gradle.plugin.tasks.GenerateTask){
generatorName = "spring"
inputSpec = "$rootDir//schema/common.yaml".toString()
outputDir = "$rootDir/generated".toString()
apiPackage = "com.abc.code.generated.controller"
modelPackage = "com.abc.code.generated.model"
configOptions = [
dateLibrary: "java8"
]
systemProperties = [
invoker : "false",
generateSupportingFiles: "true"
]
additionalProperties = [
interfaceOnly : "true",
]
您可以为 spec.yaml 保留 openApiGenerate 但一定要加上
compileJava.dependsOn common , tasks.openApiGenerate
所以你会同时执行它们。 希望我能帮到你。
我们找到了如何引用同一对象的解决方案。我们将 TestModule
作为一个单独的项目发布,它有自己的包,在其他项目中,我们使用 importMappings
配置来为对象定义正确的包名称。
importMappings = [
TestModule: "com.common.modules.TestModule"
]