【问题标题】:Is it possible to set specific package name for generated openApi spec file是否可以为生成的 openApi 规范文件设置特定的包名称
【发布时间】:2021-09-22 23:48:09
【问题描述】:

在我们的项目(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 并且从spec.yaml 生成的生成的java 类有一个导入TestModule 在导入中带有包 com.common.modules

【问题讨论】:

  • 请包含您的 Gradle 文件,该文件应包含您用于生成文件的插件配置。
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: java spring gradle openapi-generator


【解决方案1】:

有可能

当你在build.grade中添加openapi插件时

plugins { 
 
       id "org.openapi.generator" version "4.3.0"
}

您将可以访问 openApiGenerate Task ,

这可以像这样修改,例如:

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"
    ]
}

这里是您可以进行的与 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",
]

您可以将 openApiGenerate 留给 spec.yaml 但请务必添加

compileJava.dependsOn common , tasks.openApiGenerate 

所以你会同时执行它们。 希望我有所帮助。

【讨论】:

  • 感谢您的回复。你知道是否可以为相关文件指定不同的包吗?例如,我有下一个结构:spec.yamlcommon.yamlspec 文件有对 common 文件的引用。我需要使用包com.spec 生成spec 文件和使用包com.common 生成common 文件。
  • 是的,实际上它有多种可能,我会更新我的答案。
  • 非常感谢您的更新。但是,悬而未决的问题是关于这 2 个文件中的导入。使用您的配置,我们将只生成 2 个具有不同包的文件,但是如何使用正确的包定义正确的导入?我会用更多细节更新我的问题以明确。
猜你喜欢
  • 2023-03-12
  • 2020-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 2021-10-24
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多