如何使用多个 yaml 文件生成 openAPI 代码

Nic*_*las 7 java gradle openapi swagger-codegen openapi-generator

我有两个 yaml 文件,customer.yaml 和 employee.yaml。如何在单个项目中从这两个 yaml 文件生成 java 代码。我正在使用 gradle,我知道单个 yaml 的任务规范,但是如何指定多个 yaml。我应该在单个 openApiGenerator 下指定多个 inputSpec 吗?如果是,那么这样做的确切语法是什么。下面是我在 build.gradle 文件中的 openApiGenerator 任务。

``
openApiGenerate {
    generatorName = "spring"
    apiPackage = "com.xxx.generated.controller"
    modelPackage = "com.xxx.generated.model"
    inputSpec = "$rootDir//schema/employee.yaml".toString()
    outputDir = "$rootDir/generated".toString()
    configOptions = [
        dateLibrary: "java8"
    ]
    systemProperties = [
        invoker : "false", 
        generateSupportingFiles: "true"
    ]
    additionalProperties = [
        interfaceOnly : "true",
    ]
}
 ``
Run Code Online (Sandbox Code Playgroud)

我听说过 openApiGenerators 任务,它列出了通过 Open API Generators 可用的生成器,但找不到使用它的方法。

atr*_*con 10

我成功地为项目中的每个 yaml 文件动态创建任务。我正在使用 gradle 4.8.1,但我认为这也适用于下一个版本。

import groovy.io.FileType
import org.openapitools.generator.gradle.plugin.tasks.GenerateTask

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

//here we are going to store swagger files
def swaggerList = []

//iteration by swagger file root folder and save into swaggerList variable
def dir = new File("$rootDir/src/main/resources/api/".toString())
dir.eachFileRecurse(FileType.FILES) { file ->
    if (file.getName().endsWith(".yaml"))
        swaggerList << file
}

// Iterate on all swagger files and generate a task for each one with the nomenclature openApiGenerate + swagger name
swaggerList.each {
    println it.path
    def apiName = it.getName().replace(".yaml", "");

    tasks.create("openApiGenerate" + apiName.capitalize(), GenerateTask.class, {
        generatorName = "jaxrs-spec"
        inputSpec = "$rootDir/src/main/resources/api/".toString() + "${apiName}.yaml"
        outputDir = "$buildDir/generated/openapi".toString()
        apiPackage = "my.package.rest.api.definition.".toString() + "${apiName}"
        modelPackage = "my.package.rest.api.model.".toString() + "${apiName}"
        templateDir = "$rootDir/src/main/resources/api/templates".toString()
        //    https://github.com/OpenAPITools/openapi-generator/blob/master/docs/generators/jaxrs-spec.md
        configOptions = [
                dateLibrary: "java8",
                java8: true,
                useBeanValidation: true,
                interfaceOnly: true,
                useOptional: true,
                useLombok: true
        ]
    })
}

sourceSets {
    main {
        java {
            srcDir("$buildDir/generated/openapi/src/gen/java")
            srcDir("$buildDir/generated/openapi/src/main/java")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

之后,如果我有一个名为 login.yaml 的 swagger 文件和其他名为 user.yaml user.yaml 的文件,我将调用下一个 gradle 任务:

gradle openApiGenerateLogin
Run Code Online (Sandbox Code Playgroud)

或者

gradle openApiGenerateUser
Run Code Online (Sandbox Code Playgroud)


Nic*_*las 5

在 build.gradle 中添加了以下代码,我能够生成 java 代码。将spec1和spec2 yaml文件复制到schema文件夹下。此外,您需要在 build.gradle 中配置 openApi 插件和依赖项。

task buildPaymentClient(type: org.openapitools.generator.gradle.plugin.tasks.GenerateTask){
    generatorName = "spring"
    inputSpec = "$rootDir//schema/spec1.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",
    ]
}
Run Code Online (Sandbox Code Playgroud)
openApiGenerate {
    generatorName = "spring"
    apiPackage = "com.abc.code.generated.controller"
    modelPackage = "com.abc.code.generated.model"
    inputSpec = "$rootDir//schema/spec2.yaml".toString()
    outputDir = "$rootDir/generated".toString()
    configOptions = [
        dateLibrary: "java8"
    ]
    systemProperties = [
        invoker : "false", 
        generateSupportingFiles: "true"
    ]
    additionalProperties = [
        interfaceOnly : "true",
    ]
}

compileJava.dependsOn buildPaymentClient, tasks.openApiGenerate 
Run Code Online (Sandbox Code Playgroud)