一款更适合 SpringBoot 的API文档新选择(Spring Boot 应用 API 文档)

SpringDoc:Spring Boot 应用 API 文档生成的现代化解决方案

概述

SpringDoc 是一个专为 Spring Boot 应用设计的开源库,能够自动生成符合 OpenAPI 3 规范的 API 文档。它通过扫描项目中的控制器、方法注解及相关配置,动态生成 JSON/YAML/HTML 格式的文档,并提供 Swagger UI 等交互式界面供开发者查看和测试 API。
在这里插入图片描述

与 Swagger 的关系

Swagger 作为 OpenAPI 规范的前身,贡献了 API 设计理念并推动了 OpenAPI 的标准化进程,其核心工具 Swagger UI 用于展示交互式文档。需要明确的是:

  • SpringDoc 不是 Swagger 的替代品,而是基于 OpenAPI 3 规范的实现工具
  • SpringDoc 天然集成 Swagger UI 作为文档展示界面
  • 它使用现代 JSR-303 规范注解,替代了传统 Swagger 专属注解

为什么选择 SpringDoc

SpringFox 的衰落

在 SpringDoc 面世之前,Spring 生态中主要使用 SpringFox 实现 Swagger 集成:

SpringFox 工作机制:

  • 运行时扫描 Spring MVC 控制器(如 @RestController)、方法注解(如 @RequestMapping)及 Swagger 专用注解
  • 提取接口的路径、参数、响应等信息
  • 生成符合 Swagger 2.0 或 OpenAPI 3.0 规范的 JSON 文件
  • 集成 Spring 生态,提供 Docket 配置类支持自定义配置

Swagger UI 作用:

  • 将 SpringFox 生成的 JSON 文件解析为交互式网页
  • 提供接口列表、参数说明、请求示例和在线测试功能
  • 确保与其他 Swagger 工具兼容

协作流程:

  1. 开发阶段:开发者在控制器中添加 Swagger 注解描述接口细节
  2. 运行时:SpringFox 扫描代码并生成 JSON 文档
  3. 展示阶段:Swagger UI 读取 JSON 文件并渲染可视化界面

SpringDoc 的优势

自 2020 年起,SpringFox 官方基本停止维护,导致:

  • 无法适配 Spring Boot 2.6+ 及 3.x 版本
  • 与新版本 Spring 生态冲突(路径匹配失效、注解不兼容)
  • 配置复杂性问题

SpringDoc 作为新一代解决方案具有以下优势:

  • 完美支持 Spring Boot 2.6+ 及 3.x(含 JDK 17+)
  • 原生支持 OpenAPI 3 规范
  • 零配置开箱即用(仅需引入一个依赖)
  • 使用 JSR-303 规范注解(如 @Schema@Parameter),降低学习成本

最小化配置使用

第一步:引入依赖

<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.5.0</version><!-- 建议使用最新版本 -->
</dependency>

第二步:配置文件说明(可选)

# application.yml
springdoc:# API 包扫描路径(不配置则自动扫描整个项目)packages-to-scan: com.example.controllerswagger-ui:enabled: true  # 是否开启 Swagger 界面path: /swagger-ui/index.html  # 访问路径url: /v3/api-docs  # 指定 OpenAPI 文档 URLdisable-swagger-default-url: false  # 是否禁用自带示例接口api-docs:enabled: true  # 启用 OpenAPI 文档端点path: /api-docs  # 文档访问路径

第三步:基础配置类

@Configuration
@OpenAPIDefinition(info = @Info(title = "项目API文档",version = "1.0",description = "SpringBoot项目接口文档"
))
public class SpringDocConfig {// 无需额外配置,注解已定义基本信息
}

完成以上步骤后,访问 http://localhost:8080/swagger-ui/index.html 即可查看界面(无 Controller 时显示空页面)。
在这里插入图片描述

第四步:添加接口注解

未加注解的 Controller:

@RestController
@RequestMapping("/main")
public class MainController {@GetMapping("/index")public String index(String str1) {return "请求成功";}
}

界面显示效果:仅显示基础路径和参数信息,缺少详细描述。
在这里插入图片描述

添加注解的 Controller:

@RestController
@RequestMapping("/main")
@Tag(name = "演示controller", description = "演示controller")
public class MainController {@GetMapping("/index")@Operation(summary = "演示方法", description = "演示方法的注释")public String index(@Parameter(description = "参数1", required = true) String str1) {return "请求成功";}
}

界面显示效果:包含完整的模块描述、方法说明和参数说明。
在这里插入图片描述

注意:以上配置生效前提是项目未添加过滤器、拦截器或 Spring Security 等安全框架,否则需要额外配置。

分组配置

SpringDoc 支持灵活的 API 分组展示功能。

编程式配置(推荐)

@Configuration
@OpenAPIDefinition(info = @Info(title = "项目API文档",version = "1.0",description = "SpringBoot项目接口文档"
))
public class SpringDocConfig {// 默认分组(包含所有接口)@Beanpublic GroupedOpenApi defaultGroup() {return GroupedOpenApi.builder().group("默认分组").pathsToMatch("/**").build();}// 商品模块分组(路径匹配方式)@Beanpublic GroupedOpenApi productGroup() {return GroupedOpenApi.builder().group("商品模块").pathsToMatch("/api/product/**").build();}// 用户模块分组(包扫描方式)@Beanpublic GroupedOpenApi userGroup() {return GroupedOpenApi.builder().group("用户模块").packagesToScan("com.example.controller.user").build();}
}

声明式配置

springdoc:group-configs:- group: '默认分组'paths-to-match: '/**'- group: '商品模块'paths-to-match: '/api/product/**'- group: '用户模块'packages-to-scan: 'com.example.controller.user'

注意事项

  1. 分组配置优先级高于配置文件中的 packages-to-scan 配置
  2. 支持路径匹配和包扫描两种方式
  3. 同一接口可同时存在于多个分组中
  4. 如不配置默认分组,未匹配的接口将不会显示

常见问题处理

重写 WebMvcConfigurer 时的处理

如果项目重写了 addResourceHandlers 方法,需要手动添加 SpringDoc 资源映射:

@Configuration
public class ResourcesConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/swagger-ui/**").addResourceLocations("classpath:/META-INF/resources/webjars/springdoc-openapi-ui/").setCacheControl(CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic());}
}

集成 Spring Security 时的处理

需要在 Security 配置中放开相关资源的访问权限:

@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(auth -> auth.requestMatchers(HttpMethod.OPTIONS, "/**").permitAll().requestMatchers(request -> {String path = request.getServletPath();return (request.getMethod().equals("GET") && ("/".equals(path) || path.endsWith(".html") || path.endsWith(".css") || path.endsWith(".js")));}).permitAll().requestMatchers("/swagger-ui/**", "/*/api-docs/**", "/swagger-resources/**", "/webjars/**").permitAll().anyRequest().authenticated());return http.build();}
}

我的项目结构:可参考

在这里插入图片描述

总结

SpringDoc 为 Spring Boot 应用提供了现代化、标准化的 API 文档生成方案。相比传统的 SpringFox,它具有更好的兼容性、更简单的配置方式和更低的维护成本。通过本文介绍的配置方法和最佳实践,开发者可以快速集成并定制符合项目需求的 API 文档系统。

关键优势总结:

  • 开箱即用:最小配置即可快速上手
  • 全面兼容:支持最新 Spring Boot 和 JDK 版本
  • 灵活分组:支持多种方式的 API 分类管理
  • 生态集成:无缝对接 Spring Security 等常用组件
  • 规范标准:基于 OpenAPI 3 和 JSR-303 标准

通过合理运用 SpringDoc,团队可以显著提升 API 开发效率和文档质量,促进前后端协作的顺畅进行。

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

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

相关文章

文献阅读 250821-When and where soil dryness matters to ecosystem photosynthesis

When and where soil dryness matters to ecosystem photosynthesis 来自 <When and where soil dryness matters to ecosystem photosynthesis | Nature Plants> ## Abstract: Background: Projected increases in the intensity and frequency of droughts in the twen…

React学习(九)

目录&#xff1a;1.react-进阶-antd-新增2.react-进阶-antd-删除选中1.react-进阶-antd-新增新增代码&#xff0c;跟需改的代码类似&#xff0c;直接copy修改组件代码进行修改userEffect可以先带着&#xff0c;没啥用A6组件用到的函数跟修改的也类似&#xff1a;这个useEffect函…

零基础从头教学Linux(Day 17)

三层交换机一、三层交换机的配置1.关于如何配置三层交换机&#xff0c;首先我们应该先创建VLANSwitch>en Switch#vlan database % Warning: It is recommended to configure VLAN from config mode,as VLAN database mode is being deprecated. Please consult userdocument…

任务十四 推荐页面接口开发

一、接口准备 在对接qq音乐接口之前,首先要将之前的项目,一定要记得备份一份; 备份完成之后,首先要在vscode终端安装axios,这个是请求后端的工具,和之前的ajax一样,都是请求后端的工具。只不过axios更专业化,跟强大 至于qq音乐接口怎么获取,一般有两个途径,第一个是…

医疗AI与医院数据仓库的智能化升级:异构采集、精准评估与高效交互的融合方向(下)

核心功能创新详解: 统一门户与角色化工作台: 统一入口: 用户通过单一URL登录,系统根据其角色和权限自动呈现专属工作台。 角色化工作台: 临床医生工作台: 首屏展示常用患者查询入口、快速统计(如“我的患者检验异常趋势”)、相关临床文献推荐、待处理任务(如报告审核)…

数据库面试常见问题

数据库 Delete Truncate Drop 区别 答:这三个操作都是针对数据库的表进行操作,都有删除表的功能,其中的区别在于: Delete:只将表中的数据进行删除,不删除定义不释放空间,是dml语句,需要提交事务,如果不想删除可以回滚。delete每次删除一行,并在事务日志中为所删除…

用nohup setsid绕过超时断连,稳定反弹Shell

在We渗透过程中&#xff0c;我们常常会利用目标系统的远程代码执行&#xff08;RCE&#xff09;漏洞进行反弹Shell。然而&#xff0c;由于Web服务器&#xff08;如PHP、Python后端&#xff09;的执行环境通常存在超时限制&#xff08;如max_execution_time或进程管理策略&#…

Java设计模式-模板方法模式

Java设计模式-模板方法模式 模式概述 模板方法模式简介 核心思想&#xff1a;定义一个操作中的算法骨架&#xff08;模板方法&#xff09;&#xff0c;将算法中某些步骤的具体实现延迟到子类中完成。子类可以在不改变算法整体结构的前提下&#xff0c;重定义这些步骤的行为&…

Centos7物理安装 Redis8.2.0

Centos7物理安装 Redis8.2.0一、准备依赖环境首先安装编译 Redis 所需的依赖&#xff1a;# CentOS/RHEL系统 yum install -y gcc gcc-c make wget 二、下载并编译 Redis 8.2.0# 1. 下载Redis 8.2.0源码包 wget https://download.redis.io/releases/redis-8.2.0.tar.gz# 2. 解压…

牛津大学xDeepMind 自然语言处理(3)

条件语言模型无条件语言模型 概率计算&#xff1a;通过链式法则分解为预测下一词概率&#xff08;将语言建模问题简化为建模给定前面词语历史的下一个词的概率&#xff09;基于循环神经网络的无条件语言模型&#xff1a;根据历史词语预测下一个词的概率条件语言模型 定义&#…

Vue2.x核心技术与实战(一)

目录 一、Vue2.x:快速上手+插值表达式+指令上 1.1 Vue快速上手 1.1.1 Vue概念 1.1.2 创建实例 1.1.3 插值表达式 { { }} 1.1.4 响应式特性 1.1.5 开发者工具 1.2 Vue指令 1.2.1 v-html 1.2.3 v-show / v-if v-show v-if 1.2.4 v-else / v-else-if 1.2.5 v-on v…

SCAU学习笔记 - 自科三面前端方向实战演示

本来是准备写完二面直接开始写算法三面的&#xff0c;maimai那个封面图我都做好了。但是可恶的出题人说要等我出完解析再针对性避开出题&#xff0c;所以swan决定把那个先搁置&#xff0c;本文我们先以2023年的自科三面前端方向题为例带各位快速入门前端三件套&#xff08;因为…

前后端联合实现文件上传,实现 SQL Server image 类型文件上传

1、前端 Vue3QualityFileInfoDialog.vue<script setup lang"ts" name"QualityFile"> ...... // 上传&#xff0c;防抖 const onUploadClick debounce(() > {// 模拟点击元素if (fileInputRef.value) {// 重置以允许重复选择相同文件fileInputRef…

使用安卓平板,通过USB数据线(而不是Wi-Fi)来控制电脑(版本1)

这是一个对延迟和稳定性要求很高的场景。 核心原理是&#xff1a;利用USB数据线&#xff0c;在手机和电脑之间创建一个高速的“虚拟网络连接”&#xff0c;然后在这个稳定的网络通道上运行远程控制软件。 方案1&#xff1a; 在完全没有无线网络&#xff08;Wi-Fi&#xff09;和…

linux报permission denied问题

linux报permission denied问题 一般是没有可执行权限&#xff0c;需要先添加执行权限 1. 确认文件权限 在你的项目目录下执行&#xff1a; ls -l ./folder你可能会看到类似&#xff1a; -rw-r--r-- 1 user user 1234 Aug 18 12:00 script.sh注意&#xff1a;这里缺少 x&#xf…

Vue深入组件:组件事件详解2

声明触发的事件 为了让组件的用法更清晰(作为文档),同时让 Vue 能区分事件与透传 attribute,推荐显式声明组件要触发的事件。根据组件是否使用 <script setup>,声明方式有所不同。 使用 <script setup> 时:defineEmits() 宏 在 <script setup> 中,…

FLASK项目快速构建

Flask 项目构建 exts.py # flask_sqlalchemy from flask_sqlalchemy import SQLAlchemy from flask_mail import Mail from flask_caching import Cache from flask_wtf import CSRFProtect from flask_avatars import Avatars from flask_jwt_extended import JWTManager from…

数据结构--2:ArrayList与顺序表

1.顺序表的创建 2.常见操作 3.遍历 4.扩容机制 5.例子1.顺序表的创建在集合框架中&#xff0c;ArrayList是⼀个普通的类&#xff0c;实现了List接口&#xff0c;具体框架图如下&#xff1a;2.常见操作代码…

【Kubesphere】K8s容器无法访问内网xx网络问题

问题遇到的现象和发生背景 Kubesphere中运行的一个容器&#xff0c;可以ping通我们公司内网网段172.16.XX.XX&#xff0c;但是在容器内无法ping通192.168.5.XX&#xff0c;但是我在宿主机是可以ping通192.168.5.XX&#xff0c;这个192.168.5.XX是通过xx设备接进来的&#xff0c…

【开发语言】Groovy语言:Java生态中的动态力量

博客目录一、Groovy 的诞生与发展二、核心特性深度解析1. 与 Java 的无缝集成2. 动态类型与可选静态类型3. 强大的集合操作三、Groovy 在实际开发中的应用场景1. 构建自动化&#xff08;Gradle&#xff09;2. 测试开发&#xff08;Spock 框架&#xff09;3. 脚本任务自动化四、…