从 OpenAPI 3 生成 Java Spring API

2023-12-20

我尝试从 OpenAPI v3 YAML 文件生成 Spring REST 接口。 构建 说:

Successfully generated code to property(class java.lang.String, property(class java.lang.String, fixed(class java.lang.String, /home/zolv/workspaces/main/generation-test/src/main/java)))

Deprecated Gradle features were used in this build, making it 
incompatible with Gradle 6.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/5.5/userguide/command_line_interface.html#sec:command_line_warnings

但输出目录中没有生成代码。

我跟着OpenAPI 生成器 gradle 插件文档 https://github.com/OpenAPITools/openapi-generator/tree/master/modules/openapi-generator-gradle-plugin doc.

我的构建.gradle:

plugins {
  id 'java-library'
  id "org.openapi.generator" version "4.1.1"
}

repositories {
  jcenter()
}

dependencies {
    implementation "org.openapitools:openapi-generator-gradle-plugin:3.3.4"
}

openApiGenerate {
  generatorName = "spring"
  inputSpec = "$rootDir/docs/openapi/api.yml".toString()
  outputDir = "$rootDir/src/main/java".toString()
  apiPackage = "org.openapi.example.api"
  invokerPackage = "org.openapi.example.invoker"
  modelPackage = "org.openapi.example.model"
  modelFilesConstrainedTo = [
          "Error"
  ]
  configOptions = [
      dateLibrary: "java8"
  ]
}

我的 api.yml:

openapi: 3.0.2
info:
  title: API Documentation
  version: 1.0.0
servers:
  - url: http://localhost:8080/
tags:
  - name: Users
paths:
  /users:
    post:
      tags:
        - Users
      summary: Create user
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateUserRequest'
      responses:
        201:
          description: New user created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserResponse'
components:
  schemas:
    CreateUserRequest:
      title: CreateUserResponse
      required:
        - username
        - password
      type: object
      properties:
        username:
          type: string
          description: Users's username
          example: [email protected] /cdn-cgi/l/email-protection
        password:
          type: string
          description: User's password
          example: $tR0nG_pA55vv0Rd
    UserResponse:
      title: UserResponse
      required:
        - id
        - username
      type: object
      properties:
        id:
          type: string
          description: Users's identifier
          example: "1"
        username:
          type: string
          description: Users's username
          example: [email protected] /cdn-cgi/l/email-protection

api.yml 由生成器正确收集(如果文件中存在任何语法错误,则构建失败)。

构建日志中的内容看起来很可疑:Successfully generated code to property(...。不是说该属性包含了生成的结果吗?

摇篮版本:

------------------------------------------------------------
Gradle 5.5
------------------------------------------------------------

Build time:   2019-06-28 17:36:05 UTC
Revision:     83820928f3ada1a3a1dbd9a6c0d47eb3f199378f

Kotlin:       1.3.31
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.14 compiled on March 12 2019
JVM:          11.0.4 (Ubuntu 11.0.4+11-post-Ubuntu-1ubuntu218.04.3)
OS:           Linux 4.15.0-1050-oem amd64

Edit:

我已经检查过示例梯度插件 https://github.com/int128/gradle-swagger-generator-plugin/blob/master/acceptance-test/examples/openapi-v3/java-spring/build.gradle,上面的代码适用于 Gradle v4,但不适用于 5。我仍在调查。


问题似乎出在modelFilesConstrainedTo- 它将课程限制为Error。将其注释掉,它将起作用(将生成类)。

然而,还有一个问题:outputDir。根据您的设置,它将生成类似以下内容的内容:

那是错误的。另外,由于它是一个生成的来源,它不应该去src/main。更好的选择是在中生成它build目录,然后将其添加到编译类路径中。看一眼the demo https://gitlab.com/madhead-playgrounds/so57802843我为你创建的项目,这是build.gradle.kts(它几乎就像 Groovy):

plugins {
    id("java-library")
    id("org.openapi.generator").version("4.0.1")
    id("org.springframework.boot").version("2.1.8.RELEASE")
}

repositories {
    jcenter()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web:2.1.8.RELEASE")
    api("io.springfox:springfox-swagger2:2.8.0")
    api("io.springfox:springfox-swagger-ui:2.8.0")
    api("org.openapitools:jackson-databind-nullable:0.1.0")
}

val spec = "$rootDir/docs/openapi/api.yml"
val generatedSourcesDir = "$buildDir/generated/openapi"

openApiGenerate {
    generatorName.set("spring")

    inputSpec.set(spec)
    outputDir.set(generatedSourcesDir)

    apiPackage.set("org.openapi.example.api")
    invokerPackage.set("org.openapi.example.invoker")
    modelPackage.set("org.openapi.example.model")

    configOptions.set(mapOf(
            "dateLibrary" to "java8"
    ))
}

sourceSets {
    getByName("main") {
        java {
            srcDir("$generatedSourcesDir/src/main/java")
        }
    }
}

tasks {
    val openApiGenerate by getting

    val compileJava by getting {
        dependsOn(openApiGenerate)
    }
}

请注意,您还需要在生成的源(注释和 Spring 类)中使用的一堆依赖项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 OpenAPI 3 生成 Java Spring API 的相关文章

随机推荐

  • 在 CSS 中绘制空的内联框?

    我确信这很简单 但我正在尝试画一组小的 空的 inlineHTML 中的框如下所示 span style border 1px solid black span 早些时候 我们制作了简单的 gif 图像 但随着浏览器显示的放大或缩小 图像看
  • 自定义无符号整数限制和翻转

    我目前需要 C 中的特殊数据类型 我需要数据类型是一个可以保存 0 151 之间值的整数 我已经知道我可以限制最小和最大频谱 但我希望它是一个翻转功能而不是限制钳位 有点像无符号整数在达到极限时如何回绕到 0 我不明白的一件事是如何处理溢出
  • 与 ContentEditable 一起使用的所见即所得编辑器是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 这是字面上的缺点的特定于实现的行为吗?

    我正在测试中的代码这个有趣的答案 https stackoverflow com a 6866155 768472 CL USER gt defun literal cons let cons 1 2 incf cdr cons cons
  • 如何强制GTM在中添加标签?

    我已按照以下步骤在我的网站内添加 AdSense 脚本 现在您已将代码转到 GTM 创建一个新标签 提供一个名字 选择自定义 HTML 作为标记模板 将代码复制并粘贴到文本字段中 将触发器设置为在所有页面或您想要投放广告的页面上触发 单击保
  • 如何使 Geolocation API 函数在 localhost file:// 上工作?

    我有这个基本代码来使用 Geolocation API 检索纬度和经度 显示地图 html
  • 如何在 Zeus Web 服务器中为移动用户代理重写 URL?

    我需要将具有移动用户代理的任何人重定向到名为 mobile php 的文件 我的网络托管提供商 Net Registry 使用 Zeus Web 服务器 这是我根据研究编写的脚本 RULE 1 START get the document
  • Shell 和 Exec 形式的 Dockerfile 指令之间的差异

    有什么区别shell and exec表格用于 CMD CMD python my script py arg vs CMD python my script py arg ENTRYPOINT ENTRYPOINT bin main vs
  • 为什么 C++ 运算符 new/delete/variants 不应该出现在头文件中?

    有人可以解释这个 C 编译错误的本质吗 我正在涉足 学习如何重载全局运算符 new delete 及其变体 我读了一篇couple https stackoverflow com questions 13635157 c overload
  • 使用 xmlns 属性将 XSLT 应用于 XML 文档

    我将 XSLT 样式表应用到以下 XML 文件
  • 使用setTimeout绕过IE的长时间运行脚本警告

    我以前问过这个问题 并在网上找到了一些关于这个主题的文章 但我一生都无法弄清楚这一点 我有一组计算模型的 Javascript 函数 但是存在大量循环 导致脚本需要一段时间 约 4 秒 我不介意处理时间 但 IE 会提示警告 因为执行次数太
  • 在 Rails 上的参数 ruby​​ 中使用变量? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我想检查 param key 是否存在并带有变量名 如果存在 我想使用类似 params filenamestring 1 的值 filen
  • Silverlight 4:当内容变得更窄时,StackPanel 不会调整大小

    我正在使用 Silverlight 4 和 Blend 4 我有一个 水平 堆栈面板 其中包括一些文本框和一个按钮 堆栈面板设置为拉伸到内容使用的大小 文本框也可以自动调整大小 当我向文本框添加文本时 文本框大小会增大 堆栈面板也会增大 到
  • 无法使用react-router和webpack-dev-server直接进入动态路由

    启动 webpack dev server 后 我可以直接进入静态路由 例如http localhost 3456 one 但我无法直接转到动态路线 例如http localhost 3456 two 1234 我相信我的 webpack
  • Nuxt:仅在服务器端获取数据

    我使用 Github 的 API 来获取固定存储库的列表 并将调用放入 AsyncData 方法中 以便在第一次渲染时获得该列表 但我刚刚了解到 AsyncData 在服务器端调用一次 然后每次在客户端加载页面时调用 这意味着客户端不再拥有
  • X.509 证书中的专有名称长度限制

    在通用名称字段中 如 OID 2 5 4 3 的 ASN 1 表示法中所定义 限制最多为 64 个字符 如果我们想要一个超过 64 个字符的通用名 有什么办法吗 即使你可以哄骗你的证书生成代码拥有更长的 CN 它也是clients这需要改变
  • 根据字符串生成UUID

    如何在 C 中生成确定性 GUID UUID v3 v5 将命名空间和名称都作为字符串 根据 RFC4122 您需要提供命名空间作为 GUID 名称作为字符串 提供给函数 所以我想提供两个字符串而不是 guid对于命名空间和名称字符串 并且
  • 升级到 Notes 11 - Apache POI java 库的问题

    我们在 Domino 9 服务器上运行的多个 Xpages 应用程序中使用 Apache POI 库 现在 当将 HCL Notes Designer 升级到 R11 时 我们可以看到 Apache POI 在版本 4 1 1 的 jvm
  • Parent Last Classloader 解决Java类路径地狱?

    我有一个项目使用两个版本的 bouncyCastle jars bcprov jdk15 和 bcprov jdk16 jvm 加载旧版本 但我编写的一个功能需要更新版本才能运行 我尝试使用自定义类加载器来解决这个类路径地狱 经过一番谷歌搜
  • 从 OpenAPI 3 生成 Java Spring API

    我尝试从 OpenAPI v3 YAML 文件生成 Spring REST 接口 构建 说 Successfully generated code to property class java lang String property cl