当前位置: 首页 > news >正文

openapi-generator-maven-plugin自动生成HTTP远程调用客户端

Java开发中调用http接口的时候,有很多可选的技术方案,比如:HttpURLConnection、RestTemplate、WebClient、Feign、Retrofit、Okhttp等,今天我们来看一个更优的技术方案OpenAPI Generator(http://openapi-generator.tech/)

OpenAPI Generator

OpenAPI Generator 是一个开源工具集,用于根据 OpenAPI/Swagger 规范文件自动生成客户端 SDK、服务器端存根 (stub) 和 API 文档。支持 50+ 种语言和框架(Java、Python、Go、TypeScript、C#等),支持 OpenAPI 2.0 (Swagger) 和 3.x 规范,可处理 JSON 或 YAML 格式的 API 描述文件。

下面我们来看一下使用openapi-generator-maven-plugin生成利用resttemplate做远程调用的demo。

服务提供者UserService

1)api接口

 @GetMapping("/{id}")public UserDto getById(@PathVariable int id){return db.get(id);}

2)生成openapi-doc的json文件
添加依赖

<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.5.0</version>
</dependency>

访问:http://localhost:8081/v3/api-docs,得到

{"openapi": "3.0.1","info": {"title": "OpenAPI definition","version": "v0"},"servers": [{"url": "http://localhost:8081","description": "Generated server url"}],"paths": {"/{id}": {"get": {"tags": ["user-controller"],"operationId": "getById","parameters": [{"name": "id","in": "path","required": true,"schema": {"type": "integer","format": "int32"}}],"responses": {"200": {"description": "OK","content": {"*/*": {"schema": {"$ref": "#/components/schemas/UserDto"}}}}}}}},"components": {"schemas": {"UserDto": {"type": "object","properties": {"id": {"type": "integer","format": "int32"},"name": {"type": "string"}}}}}
}

服务消费者OrderService

1)引入前面生成的json文件,存放在order服务的src/resources/api/user-api.json。

2)添加openapi-generator-maven-plugin

<!--https://github.com/OpenAPITools/openapi-generator/tree/master/modules/openapi-generator-maven-plugin-->
<plugin><groupId>org.openapitools</groupId><artifactId>openapi-generator-maven-plugin</artifactId><version>7.12.0</version><executions><execution><id>rest template</id><goals><goal>generate</goal></goals><configuration><inputSpec>${project.basedir}/src/main/resources/api/user-api.json</inputSpec><generatorName>java</generatorName><configOptions><sourceFolder>src/main/java</sourceFolder><java8>true</java8><dateLibrary>java8</dateLibrary><useJakartaEe>true</useJakartaEe></configOptions><output>${project.basedir}/target/generated-sources/openapi</output><!--<packageName>com.github.xjs.user</packageName>--><apiPackage>com.github.xjs.user</apiPackage><modelPackage>com.github.xjs.user.model</modelPackage><invokerPackage>com.github.xjs.user.invoker</invokerPackage><library>resttemplate</library><generateModelTests>false</generateModelTests><generateApiTests>false</generateApiTests><generateApiDocumentation>false</generateApiDocumentation></configuration></execution>
<!--                    add other clients-->
<!--					<execution> -->
<!--					</execution>--></executions>
</plugin>

解释下几个重点的配置项:

  • inputSpec:指定 OpenAPI 规范文件路径:src/main/resources/api/user-api.json,支持 JSON/YAML 格式,可以是本地文件或 URL。
  • generatorName:生成目标为 Java 客户端代码(其他选项如 spring、kotlin 等)。
  • library:resttemplate,使用 Spring 的 RestTemplate 作为 HTTP 客户端库(替代方案:webclient、feign 等)。
  • output: 生成代码的输出目录:target/generated-sources/openapi, 默认会被 Maven 自动添加到编译路径。
  • packageName: com.github.xjs.user, 所有生成代码的根包名(API 类、模型类等会放在此包下)。
  • sourceFolder: src/main/java, 生成的 Java 代码直接输出到 src/main/java(覆盖默认的生成路径结构)。
  • java8:true, 启用 Java 8 特性(如 Optional、函数式接口等)。
  • dateLibrary: java8, 使用 java.time 包(Java 8 的日期时间库,替代 java.util.Date)。
  • useJakartaEe: true, 使用 Jakarta EE 注解(如 @jakarta.annotation.Generated),而非旧的 javax.annotation
  • generateModelTests:false,不生成模型类的测试代码(如 UserTest.java)。
  • generateApiTests:false,不生成 API 接口的测试代码(如 UserApiTest.java)。
  • generateApiDocumentation:false, 不生成 API 文档(如 README.md 或 docs/ 目录)。

3)生成源代码
命令行执行mvn clean compile就会生成对应的http调用代码:

target/generated-sources/openapi/└── src/main/java/└── com/└── github/└── xjs/└── user/├── api/       # API 接口(如 UserApi.java)├── model/     # 数据模型(如 User.java)└── ApiClient.java  # 核心客户端配置

4)服务调用

// 创建ApiClient 
ApiClient apiClient = new ApiClient();
// 设置生产者服务的baseurl
apiClient.setBasePath("http://localhost:8081");
// 创建ControllerApi
UserControllerApi userControllerApi = new UserControllerApi(apiClient);
// 利用ControllerApi远程调用api接口
UserDto user = userControllerApi.getById(userId);

完整的源码下载:https://github.com/xjs1919/learning-demo/tree/master/openapi-generator-demo

http://www.lqws.cn/news/482995.html

相关文章:

  • Python中使用RK45方法求解微分方程的详细指南
  • 【闲谈】对于c++未来的看法
  • Python安装cartopy报错,解决cartopy环境配置问题
  • Redis核心数据结构实战
  • pythonday53
  • 【论文阅读 | CVPR 2024 |Fusion-Mamba :用于跨模态目标检测】
  • 人形机器人 / 外骨骼布线难?LiquidWire可拉伸互连 + 应变传感器,让机器人 “有线但不受限”
  • C++/Qt课程设计实战指南:基础篇-1.Qt开发环境配置
  • 计算机网络通信技术与协议(九)————交换机技术
  • 安卓jetpack compose学习笔记-状态基础学习
  • 【代码解析】opencv 安卓 SDK sample - 1 - HDR image
  • Dify安装与使用
  • 《情感反诈模拟器》2025学习版
  • 【redis使用场景——缓存——双写一致性】
  • 算法 : 把数字翻译成字符串
  • react day.js使用及经典场景
  • 掌握C++核心特性
  • UI TARS 和 Magentic-UI的区别和差异
  • Java面试复习指南:基础、多线程、JVM、Spring、算法精要
  • 飞轮储能VSG控制策略辅助双馈风机一次调频的仿真模型研究
  • RL 基础 (CH3,动态规划)
  • Dify 1.4.3技术研究报告:新一代AI应用开发平台的核心优势与行业实践
  • 【PyTorch项目实战】CycleGAN:无需成对训练样本,支持跨领域图像风格迁移
  • 稳压二极管“漏电流”的动态电阻效应
  • 【编程语言】javascript、java、go对比应用场景
  • 9大策略深度解析MySQL多表JOIN性能优化
  • BERT 模型准备与转换详细操作流程
  • Bytemd@Bytemd/react详解(编辑器实现基础AST、插件、跨框架)
  • Macbook M4芯片 MUMU模拟器安装使用burpsuit抓包教程APP
  • WEB3合约开发以太坊中货币单位科普