总览
以往web开发中,编写controller层的conVO对象代码占据了大量时间,如果我们能直接用接口yaml文件生成这些对象就好了,这样我们编写的yaml文件可以直接生成controller层以及VO对象,我们也可以把yaml文件直接提供给调用方,生成http客户端代码发起服务调用。本工程提供了利用openapitools利用yaml文件直接生成controller代码以及httpclient客户端,符合API-First开发理念。
什么是API-First开发理念
API-First(API 优先)是一种以 API 为核心驱动的软件开发模式—— 在编写任何业务代码前,先设计、定义并冻结 API 规范(如 OpenAPI/Swagger 规范),再以该规范为 “契约”,同步推进前后端、跨语言(如 Java/C++)开发,最终所有模块通过统一 API 对接。
简单说:先定 “接口契约”,再写代码,而非传统 “先写后端代码,再凑接口文档,最后前端适配” 的模式。
OpenAPITools介绍
OpenAPI Generator 能够根据 OpenAPI 规范(同时支持 2.0 和 3.0 版本),自动生成 API 客户端库(SDK 生成)、服务端桩代码(接口骨架)、文档及配置文件。OpenAPITools主页
OpenAPI Generator快速入门
本章节我们将演示如何通过一个swagger的yaml接口文件生成controller以及okhttp/feign等客户端代码。使用jdk21
项目已在github上开源
https://github.com/zjurenjie/java-openapi-generator
新建项目工程
项目工程结构如下:
|---java-openapi-generator|---pom.xm# 父pom文件,定义三方件的依赖版本|---java-openapi-controller# 服务端模块,生成controller层代码|---src/main/java# 服务端代码|---src/main/resource# 资源文件|---openapi|---v1|---openapi.yaml# 接口yaml,用于生成服务端controller与客户端代码|---java-openapi-sdk# 客户端模块,生成okhttp/feign等客户端代码配置maven依赖
测试yaml文件
这里我们可以使用OpenAPI Generator样例中的yaml示例也可以使用自己已经写好的yaml,这里使用OpenAPI Generator样例中的ping some object示例并加tag为curl的相关方法
OpenAPI Generator样例
openapi:3.0.1info:title:ping some objectversion:"1.0"servers:-url:http://localhost:8082/tags:-ping-curlpaths:/ping:get:operationId:getPingparameters:-description:ID of pet that needs to be updatedexplode:truein:queryname:petIdrequired:trueschema:format:int64type:integerstyle:formrequestBody:content:application/x-www-form-urlencoded:schema:$ref:"#/components/schemas/getPing_request"responses:"200":content:application/json:schema:$ref:"#/components/schemas/SomeObj"description:OKtags:-pingx-streaming:truex-group-parameters:truex-content-type:application/x-www-form-urlencodedx-accepts:-application/jsonpost:operationId:postPingrequestBody:content:application/json:schema:$ref:"#/components/schemas/SomeObj"responses:"200":content:application/json:schema:$ref:"#/components/schemas/SomeObj"description:OKtags:-pingx-streaming:truex-content-type:application/jsonx-accepts:-application/json/curl:get:operationId:getCurlparameters:-description:ID of pet that needs to be updatedexplode:truein:queryname:petIdrequired:trueschema:format:int64type:integerstyle:formrequestBody:content:application/x-www-form-urlencoded:schema:$ref:"#/components/schemas/getCurl_request"responses:"200":content:application/json:schema:$ref:"#/components/schemas/SomeObj"description:OKtags:-curlx-streaming:truex-group-parameters:truex-content-type:application/x-www-form-urlencodedx-accepts:-application/jsonpost:operationId:postCurlrequestBody:content:application/json:schema:$ref:"#/components/schemas/SomeObj"responses:"200":content:application/json:schema:$ref:"#/components/schemas/SomeObj"description:OKtags:-pingx-streaming:truex-content-type:application/jsonx-accepts:-application/jsoncomponents:schemas:SomeObj:example:name:nameactive:true$_type:SomeObjIdentifierid:0type:typeproperties:$_type:default:SomeObjIdentifierenum:-SomeObjIdentifiertype:stringid:format:int64type:integername:type:stringactive:type:booleantype:type:stringtype:objectSimpleOneOf:oneOf:-type:string-type:integergetPing_request:properties:name:description:Updated name of the pettype:stringstatus:description:Updated status of the pettype:stringtype:objectgetCurl_request:properties:name:description:Updated name of the pettype:stringstatus:description:Updated status of the pettype:stringtype:object使用maven插件生成服务端代码
openapi-generator-maven-plugin官网指导
https://github.com/OpenAPITools/openapi-generator/blob/master/modules/openapi-generator-maven-plugin/README.md
工程中配置如下:使用maven-clean-plugin插件自动清理生成的文件,使用openapi-generator-maven-plugin生成服务端代码
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-clean-plugin</artifactId><configuration><filesets><fileset><directory>${project.basedir}/src/main/java/org/org/numb/openapi/generator/gen</directory></fileset></filesets></configuration></plugin><plugin><groupId>org.openapitools</groupId><artifactId>openapi-generator-maven-plugin</artifactId><!-- RELEASE_VERSION --><version>${openapi-generator-maven-plugin.version}</version><executions><execution><id>generate-controller</id><phase>generate-resources</phase><goals><goal>generate</goal></goals><configuration><!-- 1. 关键配置:OpenAPI 规范文件(本地路径或 URL) --><inputSpec>${project.basedir}/src/main/resources/openapi/v1/openapi.yaml</inputSpec><!-- 或从远程 API 获取规范:<inputSpec>http://localhost:8080/v3/api-docs</inputSpec> --><!-- 2. 生成代码目标语言(必填,支持 50+ 语言,小写) --><!-- 常用语言:java、python、go、typescript-axios、php、csharp 等 --><generatorName>spring</generatorName><library>spring-boot</library><!-- 3. 输出目录(生成的代码存放位置,默认 src/main/java) --><output>${project.basedir}</output><!-- 4. 包配置(Java 语言专属,指定生成代码的包名) --><packageName>org.org.numb.openapi.generator.gen</packageName><!-- 根包名 --><apiPackage>org.org.numb.openapi.generator.gen.delegate</apiPackage><!-- API 操作类包名 --><modelPackage>org.org.numb.openapi.generator.gen.model</modelPackage><!-- 数据模型包名 --><!-- 5. 额外配置(可选,根据语言自定义) --><generateModelTests>false</generateModelTests><!-- 不生成模型测试代码 --><generateApiTests>false</generateApiTests><!-- 不生成API测试代码 --><openapiGeneratorIgnoreList>pom.xml</openapiGeneratorIgnoreList><configOptions><interfaceOnly>true</interfaceOnly><dateLibrary>java21</dateLibrary><!-- 日期处理用 Java8 LocalDate --><useJakartaEe>true</useJakartaEe><!-- 是否使用 Jakarta EE(默认 false,用 Java EE) --><useBeanValidation>true</useBeanValidation><delegatePattern>true</delegatePattern><useSpringController>false</useSpringController><useOneOfInterfaces>true</useOneOfInterfaces></configOptions><!-- 6. 忽略已存在的文件(避免覆盖手动修改的代码,可选) --><ignoreFileOverride>${project.basedir}/</ignoreFileOverride></configuration></execution></executions></plugin></plugins></build>configuration常用配置
inputSpec:OpenAPI 规范文件(本地路径或 URL)generatorName:生成代码目标语言,当生成服务端代码时使用spring,library支持spring-boot、spring-cloud等标签library:服务端常用spring-boot、spring-cloud。spring-boot为生成controller代码,如果指定spring-cloud还会生成feign的客户端接口output:输出目录(生成的代码存放位置,默认 src/main/java)packageName:根包名配置(Java 语言专属,指定生成代码的包名)apiPackage:API 操作类包名modelPackage: 数据模型包名generateModelTests:不生成模型测试代码generateApiTests:不生成API测试代码openapiGeneratorIgnoreList:不生成的文件列表,这里可以配置pom.xml,让我们可以重新定义依赖组件的版本,不由openapi-tools控制
configOptions常用配置
interfaceOnly: 只生成controller接口代码,不生成实现类useJakartaEe:是否使用 Jakarta EE(默认 false,用 Java EE),使用jdk17/jdk21与springboot3.x设置为trueuseBeanValidation:是否开启bean校验delegatePattern:是否使用代理模式生成服务端代码
spring服务端更多配置参考:
https://openapi-generator.tech/docs/generators/spring/#config-options
客户端配置与服务端配置不同,可根据生成代码需求按照generator类型分类查找
https://openapi-generator.tech/docs/generators/