简体   繁体   English

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

[英]How to generate openAPI code using multiple yaml file

I have two yaml file, customer.yaml and employee.yaml.我有两个 yaml 文件,customer.yaml 和 employee.yaml。 How do I generate java code from these two yaml file in single project.如何在单个项目中从这两个 yaml 文件生成 java 代码。 I'm using gradle, I know the task specification for single yaml but how do I specify multiple yaml.我正在使用 gradle,我知道单个 yaml 的任务规范,但是如何指定多个 yaml。 Should I specify mutiple inputSpec under single openApiGenerator?我应该在单个 openApiGenerator 下指定多个 inputSpec 吗? if yes then what is the exact syntax to do so.如果是,那么这样做的确切语法是什么。 Below is my openApiGenerator task in build.gradle file.下面是我在 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",
    ]
}
 ``

I heard of openApiGenerators task which Lists generators available via Open API Generators but couldn't find a way to use it.我听说过 openApiGenerators 任务,它列出了通过 Open API Generators 可用的生成器,但找不到使用它的方法。

Added following code in build.gradle and I was able to generate the java code.在 build.gradle 中添加了以下代码,我能够生成 java 代码。 Copy the spec1 & spec2 yaml file under schema folder.复制 schema 文件夹下的 spec1 & spec2 yaml 文件。 Additionally, you need to have openApi plugin and dependencies configured in build.gradle.此外,您需要在 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",
]

} }

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 

I succeeded in creating dynamically the tasks for each of the yaml files you have in your project.我成功地为项目中的每个 yaml 文件动态创建了任务。 I'm using gradle 4.8.1 but I think that applies to next versions too.我正在使用 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")
        }
    }
}

After this if I have a swagger file named login.yaml and other named user.yaml user.yaml I call next gradle tasks: After this if I have a swagger file named login.yaml and other named user.yaml user.yaml I call next gradle tasks:

gradle openApiGenerateLogin

Or或者

gradle openApiGenerateUser

Same problem here, different solution.同样的问题,不同的解决方案。 I really like the idea of working in separate files, however, while sharing the spec within dev team or importing it in tools like postman, insomnia or some API gateway, a single file is really more accurate and simple.我真的很喜欢在单独的文件中工作的想法,但是,在开发团队中共享规范或将其导入 postman、失眠或某些 API 网关等工具时,单个文件确实更加准确和简单。

So, I would like to recommend the use of openapi-merger-plugin for this task.所以,我想推荐使用openapi-merger-plugin来完成这个任务。 It works like a charm.它就像一个魅力。

Here is how I solved this problem:这是我解决这个问题的方法:

// Merging all OpenAPI Files
openApiMerger {
    inputDirectory.set(file("${rootDir}/src/main/resources/api/".toString()))
    output {
        directory.set(file("${buildDir}/generated/openapi/".toString()))
        fileName.set("openapi")
        fileExtension.set("yaml")
    }
    openApi {
        openApiVersion.set("3.0.1")
        info {
            title.set("Open API Merger")
            description.set("All files merged by open api merger")
            version.set("${project.version}".toString())
            termsOfService.set("http://openapimerger.com/terms-of-service")
            contact {
                name.set("OpenApiMerger Team")
                email.set("openapi@sample.com")
                url.set("http://openapimerger.com")
            }
            license {
                name.set("Apache License v2.0")
                url.set("http://apache.org/v2")
            }
        }
        externalDocs {
            description.set("External docs description")
            url.set("http://external-docs.com/uri")
        }
    }
}

// Generating code only once
openApiGenerate {
    generatorName   = "spring"
    inputSpec       = "${buildDir}/generated/openapi/openapi.yaml"
    outputDir       = "${buildDir}/generated/openapi"
    packageName     = "com.xxx.generated"
    apiPackage      = "com.xxx.generated.controller"
    modelPackage    = "com.xxx.generated.model"
    modelNameSuffix = ""
    validateSpec    = true
    configOptions   = [
        dateLibrary         : "java8",
        interfaceOnly       : "true",
        swaggerDocketConfig : "false"
    ]
}

// Making generated source visible (classpath)
sourceSets {
    main {
        java {
            srcDir "${buildDir}/generated/openapi/src/main/java"
        }
    }
}

// Integrating plugin tasks with compiling
tasks.openApiGenerate {
    dependsOn  tasks.mergeOpenApiFiles
}
compileJava {
    dependsOn  tasks.openApiGenerate
    source "${buildDir}/generated/openapi/src/main/java"
}

In my cases I use same task options and ony with different spec yml file name, so here's my solution:在我的情况下,我使用相同的任务选项,并且使用不同的规范 yml 文件名,所以这是我的解决方案:

Assume you have 2 swagger yml files:假设您有 2 个 swagger yml 文件:

  • src/main/resources/swagger/api1.yml src/main/resources/swagger/api1.yml
  • src/main/resources/swagger/api2.yml src/main/resources/swagger/api2.yml

Then:然后:

swagger.gradle : swagger.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.openapitools:openapi-generator-gradle-plugin:${openapiPluginDependencyVersion}"
    }
}
apply plugin: "org.openapi.generator"

void createOpenApiGenerateTask(String ymlName) {
    String taskName = "openApiGenerate_" + ymlName;
    task(taskName, type: org.openapitools.generator.gradle.plugin.tasks.GenerateTask) {
        inputSpec = "$rootDir/src/main/resources/swagger/${ymlName}.yml".toString()
        // other common task options goes here...
        // e.g.
        // outputDir = "$buildDir/openapi".toString()
        // apiPackage = "com.example.api"
        // ...
    }
    compileJava.dependsOn(taskName)

}

String[] ymlNames = [
        "api1",
        "api2"
]
for (String ymlName : ymlNames) {
    createOpenApiGenerateTask(ymlName);
}

sourceSets {
    main {
        java {
            srcDir file("${project.buildDir.path}/openapi/src/main/java")
        }
    }
}

gradle.properties : gradle.properties

openapiPluginDependencyVersion=4.3.0

build.gradle : build.gradle

apply from: "gradle/swagger.gradle"

The following worked for me adding it to the build.gradle.kts:以下对我有用,将其添加到 build.gradle.kts:

    mapOf(
        // the keys need to be sorded descendingly
        "api2" to "src/main/resources/openapi/api2.yml",
        "api1" to "src/main/resources/openapi/api1.yml"
    ).forEach {
        openApiGenerate {
            generatorName.set("kotlin")
            inputSpec.set("$rootDir/${it.value}")
            outputDir.set("$buildDir/generated/openapi")
            apiPackage.set("my.company.service.openapi")
            modelPackage.set("my.company.domain.openapi.${it.key}")

            configOptions.set(mapOf(
                "dateLibrary" to "java11"
            ))
            sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME).java.srcDir("$buildDir/generated/openapi/src")
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何从 OpenAPI 3.0 yaml 文件生成 JSON 示例? - How to generate JSON examples from OpenAPI 3.0 yaml file? 如何使用Openapi Generator从Swagger yaml生成SpringBoot模型 - How to generate SpringBoot models from Swagger yaml with Openapi Generator 使用swagger codegen插件通过几个yaml文件生成代码 - generate code via several yaml file using swagger codegen plugin 如何在openapi yaml规范中使用allOf组合两个组件? - How to combine two components using allOf in openapi yaml specification? 如何使用 springdoc-openapi-maven-plugin 和 swagger-codegen-maven-plugin 生成客户端代码? - How to generate client code using springdoc-openapi-maven-plugin and swagger-codegen-maven-plugin? 如何使用 openapi-generator 为打开的 API 规范文件生成模拟 - How to generate mocks for open API spec file by using openapi-generator 使用 maven 项目和输入 YAML 的 openapi 代码生成器时,bearerAuth 类型授权出现问题 - Problem with bearerAuth type authorization when using openapi code generator using a maven project and a input YAML 如何将 openapi.yaml 添加到您的项目中 - How to add openapi.yaml to your project OpenAPI-为更改的api生成服务器代码? - OpenAPI - generate server code for a changing api? Java Maven openapi/swaggerui 生成文件脚本 - Java Maven openapi/swaggerui generate file script
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM