Spring Boot 3 整合 SpringDoc OpenAPI 生成接口文档

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

Spring Boot整合 SpringDoc OpenAPI 生成接口文档

  • 1、前言
  • 2、SpringDoc OpenAPI版本介绍
  • 3、项目初始化
    • ❶ 配置依赖
    • ❷ 配置 Springdoc OpenAPI
    • ❸ 编写 REST Controller
    • ❹ 测试查看文档
  • 4、如何进行文档分组
  • 5、更换接口文档UI
  • 6、字段必填如何设置
  • 7、结语

1、前言

本文对应代码下载地址:https://download.csdn.net/download/lhmyy521125/89459959 无需积分!

在我们日常开发过程中,维护良好的 API 文档对于团队协作和开发效率至关重要。SpringDoc OpenAPI 是一个强大的工具,能够帮助我们轻松生成 OpenAPI 3.0 规范的文档,并提供交互式的 Swagger UI 界面。

在这里插入图片描述
本文跟着博主一起来学习如何在 Spring Boot 3 项目中整合 SpringDoc OpenAPI,生成在线接口文档

2、SpringDoc OpenAPI版本介绍

目前 SpringDoc OpenAPI 有两个版本 1.x 以及 2.x , 以下是版本对应的支持:

Springdoc OpenAPI 1.x:支持 JDK 8 及以上版本(Spring Boot 2.x and 1.x.)
Springdoc OpenAPI 2.x:最新版本要求 JDK 11 及以上(Spring Boot 3.x)

下表描述了两个版本主要模块的更改:

springdoc-openapi-v1springdoc-openapi-v2描述
springdoc-openapi-commonspringdoc-openapi-starter-common包含基础springdoc-openapi功能
springdoc-openapi-data-restspringdoc-openapi-starter-commonSpringData Rest 支持
springdoc-openapi-groovyspringdoc-openapi-starter-commonGroovy支持
springdoc-openapi-hateoasspringdoc-openapi-starter-commonSpring Hateoas 支持
springdoc-openapi-javadocspringdoc-openapi-starter-commonJavadoc支持
springdoc-openapi-kotlinspringdoc-openapi-starter-commonkotlin支持
springdoc-openapi-securityspringdoc-openapi-starter-commonSpring Security支持
springdoc-openapi-webmvc-corespringdoc-openapi-starter-webmvc-apiSpring WebMvc支持
springdoc-openapi-webflux-corespringdoc-openapi-starter-webflux-apiSpring WebFlux支持
springdoc-openapi-uispringdoc-openapi-starter-webmvc-ui在Spring WebMvc上下文中使用Swagger-UI
springdoc-openapi-webflux-uispringdoc-openapi-starter-webflux-ui在Spring WebFlux上下文中使用Swagger-UI

确保你使用的 JDK 版本与 springdoc-openapi 的版本相匹配。如果你使用的是 Spring Boot 3Springdoc OpenAPI 2.x 是推荐的版本,因为 Spring Boot 3 也要求 JDK 17 及以上

3、项目初始化

❶ 配置依赖

创建一个新的 Spring Boot 3 项目,这里博主选用的JDK版本为JDK17 ,Spring Boot: 3.0.0,在我们的在 pom.xml 文件中添加 Springdoc OpenAPI 的依赖

	<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Springdoc OpenAPI Starter --><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.5.0</version></dependency>

❷ 配置 Springdoc OpenAPI

springdoc-openapi 通过自动配置大多数情况下无需额外配置,但如果小伙伴有特定需求,可以在 application.yml 文件中添加配置,如:

springdoc:api-docs:enabled: true #path: /api-docs # 默认/v3/api-docsswagger-ui:path: /swagger-ui.html #自定义swagger-ui HTML文档路径

❸ 编写 REST Controller

创建一个简单的 REST 控制器,并使用 OpenAPI 注解来描述 API

定义User对象
首先,我们为 User 类的字段添加注解说明

/**
* description 字段描述
* example 字段返回示例
**/
@Data
public class User {@Schema(description = "用户ID", example = "1")private Long id;@Schema(description = "用户姓名", example = "张三")private String name;@Schema(description = "用户邮箱", example = "zhansan@qq.com")private String email;
}

创建一个简单的 REST Controller,并使用 OpenAPI 注解来描述 API

import com.toher.springdoc.bean.User;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import org.springframework.web.bind.annotation.*;/*** @Author 麦可乐* @Date 2024/6/20 11:17 AM* @Version 1.0*/@RestController
@RequestMapping("/api/users")
public class UserController {@Operation(summary = "获取用户信息接口", description = "通过用户ID获取用户信息")@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "用户信息",content = {@Content(mediaType = "application/json",schema = @Schema(implementation = User.class))}),@ApiResponse(responseCode = "404", description = "无法获取用户信息")})@GetMapping("/{id}")public User getUserById(@Parameter(description = "用户ID") @PathVariable Long id) {//模拟数据库获取用户User user = new User();user.setId(1L);user.setName("张三");user.setEmail("zhansan@qq.com");return user;}@Operation(summary = "创建用户接口", description = "创建一个新用户并返回带有用户id的User对象")@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "用户创建",content = {@Content(mediaType = "application/json",schema = @Schema(implementation = User.class))})})@PostMappingpublic User createUser(@RequestBody User user) {//模拟数据库保存用户并返回用户ID主键user.setId(1L);return user;}
}

❹ 测试查看文档

最后启动项目访问查看文档 http://localhost:端口号/swagger-ui,小伙伴应该能够看到自动生成的 API 文档,并可以在界面中进行 API 测试,如下图:

在这里插入图片描述

4、如何进行文档分组

很多时候我们的接口很多,且可能不同的开发人员分配不同的模块,如果所有接口都集中在一起,很明显不利于我们查阅,这里博主介绍一下如何对文档进行分组。

需要实用一个配置 group-configs, 如博主的配置

springdoc:api-docs:enabled: true #path: /api-docs # 默认/v3/api-docsswagger-ui:path: /swagger-ui.htmlgroup-configs: #进行文档分组每个组配置对应的请求路径以及区分所在包- group: 'user'paths-to-match: '/api/users/**'packages-to-scan: com.toher.springdoc.user- group: 'product'paths-to-match: '/api/product/**'packages-to-scan: com.toher.springdoc.product

继续测试访问文档,右上角 Select a definition 查看是否已经分组
在这里插入图片描述

5、更换接口文档UI

相信很多小伙伴还是不喜欢swagger-ui的文档,这里博主介绍一个集 Swagger2OpenAPI3 为一体的增强解决方案 - Knife4j

要使用 Knife4j 非常简单,只需要引入依赖即可

<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.4.0</version>
</dependency>

如果你希望开启 Knife4j 的增强,可以在yml配置文件中追加,具体Knife4j增强配置明细,可以查看官方文档 https://doc.xiaominfo.com/docs/features/enhance 这里就不赘述了

# knife4j的增强配置,不需要增强可以不配
knife4j:enable: truesetting:language: zh_cn

重启我们的 SpringBoot 应用访问 http://localhost:端口号/doc.html 查看

在这里插入图片描述

6、字段必填如何设置

相信很多小伙伴在SpringBoot2的时候对于文档中一些字段的要求,如:必填,我们可以使用一个注解属性 required = true 来说明

	@Schema(description = "用户姓名", example = "张三" , required = true)private String name;

但实际上在最新版本的 Springdoc OpenAPI 中,@Schema 注解的 required 属性已经被标记为过时。取而代之的是将字段的非空校验放在参数或方法级别的注解上,结合 jakarta.validation

Springdoc OpenAPI 3 中,你可以使用 @Parameter@RequestBody 注解来指定字段是否必需,同时在 @Schema 注解中可以通过指定非空属性

下面我们来改造一下我们之前的代码

User对象

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotNull;
import lombok.Data;@Data
public class User {@Schema(description = "用户ID", example = "1")private Long id;@Schema(description = "用户姓名", example = "张三")@NotNull(message = "Name必填")private String name;@Schema(description = "用户邮箱", example = "zhansan@qq.com")@NotNull(message = "Email必填")@Email(message = "邮箱格式不正确")private String email;
}

UserController

import com.toher.springdoc.user.bean.User;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/api/users")
@Tag(name = "用户接口")
public class UserController {@Operation(summary = "获取用户信息接口", description = "通过用户ID获取用户信息")@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "用户信息",content = {@Content(mediaType = "application/json",schema = @Schema(implementation = User.class))}),@ApiResponse(responseCode = "404", description = "无法获取用户信息")})@GetMapping("/{id}")public User getUserById(@Parameter(description = "用户ID") @PathVariable Long id) {//模拟数据库获取用户User user = new User();user.setId(1L);user.setName("张三");user.setEmail("zhansan@qq.com");return user;}@Operation(summary = "创建用户接口", description = "创建一个新用户并返回带有用户id的User对象")@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "用户创建",content = {@Content(mediaType = "application/json",schema = @Schema(implementation = User.class))})})@PostMappingpublic User createUser(@Valid @RequestBody User user) {//模拟数据库保存用户并返回用户ID主键user.setId(1L);return user;}
}

OK,我们还是重启应用观察文档说明。是否必填项上已经显示必填

在这里插入图片描述

7、结语

通过整合 Spring Boot 3 和 Springdoc OpenAPI,可以非常方便地生成交互式的在线 API 文档,帮助开发者和使用者理解和测试 API。这不仅提高了开发效率,还能保证文档的及时更新,保持与实际代码的一致性。

到这里相信小伙伴们已经能熟练在Spring Boot 3中生成接口文档了。如果本文对您有所帮助,希望 一键三连 给博主一点点鼓励,如果您有任何疑问或建议,请随时留言讨论!


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 工具 之 Azure 微软 【GPT4o】HttpClient 异步流式请求的简单封装

Unity 工具 之 Azure 微软 【GPT4o】HttpClient 异步流式请求的简单封装 目录 Unity 工具 之 Azure 微软 【GPT4o】HttpClient 异步流式请求的简单封装 一、简单介绍 二、实现原理 三、注意实现 四、简单效果预览 五、案例简单实现步骤 六、关键代码 一、简单介绍 Unit…

网络安全:Web 安全 面试题.(XSS)

网络安全&#xff1a;Web 安全 面试题.&#xff08;XSS&#xff09; 网络安全面试是指在招聘过程中,面试官会针对应聘者的网络安全相关知识和技能进行评估和考察。这种面试通常包括以下几个方面&#xff1a; &#xff08;1&#xff09;基础知识:包括网络基础知识、操作系统知…

超级好用的JSON格式化可视化在线工具

JSON是开发非常常用的一种报文格式&#xff0c;最常见的需求就是将JSON进行格式化&#xff0c;最好是有图形化界面显示结构关系&#xff0c;以便进行数据分析。 理想的在线JSON工具&#xff0c;应该支持快速格式化、可压缩、快捷复制、可下载导出&#xff0c;对存在语法错误的地…

网络与协议安全复习 - 系统安全部分

文章目录 恶意软件什么是恶意软件传播机制和载荷传播载荷 DDoS 攻击和防范 防火墙什么是防火墙防火墙类型防火墙载体 入侵检测入侵者入侵检测蜜罐技术 口令管理基于Bloom过滤器的口令检查技术 恶意软件 什么是恶意软件 恶意软件定义为&#xff1a;隐蔽植入另一段程序的程序&a…

Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单

文章目录 一、SSO介绍1、使用SSO的好处 二、中间件介绍1、Express安装导入使用 2、cors安装导入配置 3、express-session安装导入配置使用 4、jsonwebtoken安装导入使用 5、jwt和session对比 三、SSO实现方案1、安装依赖2、结构3、实现原理 三、示例代码1、nodejs端 server/ind…

React是怎么进行事件处理的

什么是事件&#xff1f; 事件是指一些可以通过脚本响应的页面动作。当用户按下鼠标或者提交一个表单等等时候&#xff0c;事件都会出现。事件处理是一段JavaScript代码&#xff0c;总是与页面中的特定部分以及一定的事件相关联。当与页面特定部分相关联的事件发生时&#xff0c…

MDK-ARM 编译后 MAP 文件分析

本文配合 STM32 堆栈空间分布 食用更佳&#xff01; 一图胜千言。。。

pytorch十大核心操作

PyTorch的十大核心操作涵盖了张量创建、数据转换、操作变换等多个方面。以下是结合参考文章信息整理出的PyTorch十大核心操作的概述&#xff1a; 张量创建&#xff1a; 从Python列表或NumPy数组创建张量。使用特定值创建张量&#xff0c;如全零、全一、指定范围、均匀分布、正…

开发环境安装---Visual Studio Code

开发环境安装---Visual Studio Code 1.官网下载Visual Studio Code2.安装步骤3.安装插件 1.官网下载Visual Studio Code VScode: https://code.visualstudio.com/ Visual Studio Code 简称 VSCode &#xff0c;2015 年由微软公司发布。可用于 Windows&#xff0c;macOS 和 Li…

HTML(17)——圆角和盒子阴影

盒子模型——圆角 作用&#xff1a;设置元素的外边框为圆角 属性名&#xff1a;border-radius 属性值&#xff1a;数字px/百分比 也可以每个角设置不同的效果&#xff0c;从左上角顺时针开始赋值&#xff0c;没有取值的角与对角取值相同。 正圆 给正方形盒子设置圆角属性…

数据库实战(二)(引言+关系代数)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;数据库 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 常见概念 一、什么是数据库&#xf…

【鸿蒙】HUAWEI DevEco Studio安装

HUAWEI DevEco Studio介绍 面向HarmonyOS应用及元服务开发者提供的集成开发环境(IDE)&#xff0c; 助力高效开发。 DevEco Studio当前最新版本是&#xff1a; 3.1。 DevEco Studio计划里程碑 版本类型说明 下载 下载网址&#xff1a;DevEco Studio安装包官⽅下载 双击运行…

C++ | Leetcode C++题解之第169题多数元素

题目&#xff1a; 题解&#xff1a; class Solution { public:int majorityElement(vector<int>& nums) {int candidate -1;int count 0;for (int num : nums) {if (num candidate)count;else if (--count < 0) {candidate num;count 1;}}return candidate;…

STM32通过Flymcu串口下载程序

文章目录 1. Flymcu 2. 操作流程 2.1 设备准备 2.2 硬件连接 2.3 设置BOOT引脚 2.4 配置 2.5 下载程序 1. Flymcu Flymcu软件可以通过串口给STM32下载程序&#xff0c;如果没有STLINK的时候&#xff0c;就可以使用这个来烧录程序。软件不用安装&#xff0c;直接打开就行…

Windows11+CUDA12.0+RTX4090如何配置安装Tensorflow2-GPU环境?

1 引言 电脑配置 Windows 11 cuda 12.0 RTX4090 由于tensorflow2官网已经不支持cuda11以上的版本了&#xff0c;配置cuda和tensorflow可以通过以下步骤配置实现。 2 步骤 &#xff08;1&#xff09;创建conda环境并安装cuda和cudnn&#xff0c;以及安装tensorflow2.10 con…

[Python学习篇] Python字典

字典是一种可变的、无序的键值对&#xff08;key-value&#xff09;集合。字典在许多编程&#xff08;Java中的HashMap&#xff09;任务中非常有用&#xff0c;因为它们允许快速查找、添加和删除元素。字典使用花括号 {} 表示。字典是可变类型。 语法&#xff1a; 变量 {key1…

CIRCOS圈图绘制 - circos安装

Circos是绘制圈图的神器&#xff0c;在http://circos.ca/images/页面有很多CIRCOS可视化的示例。 Circos可以在线使用&#xff0c;在线使用时是把表格转为圈图&#xff0c;不过只允许最大75行和75列&#xff1b;做一些简单的示意图会比较好&#xff0c;最后时会介绍下在线的tab…

第二十四篇——纠错码:对待错误的正确态度是什么?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 当我们面对错误的发生&#xff0c;是一个确定事件的时候&#xff1b;我们…

Golang | Leetcode Golang题解之第169题多数元素

题目&#xff1a; 题解&#xff1a; func majorityElement(nums []int) (ans int) {cnts : 0for _, v : range nums {if v ans {cnts} else if cnts 0 {ans v} else {cnts--}}return }

python flask配置邮箱发送功能,使用flask_mail模块

&#x1f308;所属专栏&#xff1a;【Flask】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点…