告别手写文档!Spring Boot API 文档终极解决方案:SpringDoc OpenAPI

图片

在前后端分离和微服务盛行的今天,API 文档是团队协作的“通用语言”。一份清晰、准确、实时同步的文档,能极大提升开发和联调效率。然而,手动编写和维护 API 文档(如 Word、Markdown 或 Postman)是一场永无止境的噩梦——它总是滞后于代码的变更。

曾经,Springfox (Swagger 2) 是这个领域的王者,但随着 Spring Boot 3.x 的到来,它已廉颇老矣。现在,SpringDoc OpenAPI 凭借其与 Spring Boot 的无缝集成和对 OpenAPI 3 规范的全面支持,成为了当之无愧的“终极解决方案”。

本文将带你从零开始,深入探索 SpringDoc 的使用,从快速集成到精细化定制,让你彻底告别手写文档的痛苦。

1. 为什么选择 SpringDoc?

在2025年的今天,对于任何新的 Spring Boot 项目,选择 SpringDoc 而非其前辈 Springfox 的理由非常充分:

  • • 无缝集成 Spring Boot 3.x: SpringDoc 是为现代 Spring Boot 版本量身打造的,能完美兼容 Spring Framework 6.x 和 Jakarta EE 9+。

  • • 支持 OpenAPI 3 规范: OpenAPI 3 是 API 描述的最新行业标准,提供了更丰富、更强大的规范定义能力。

  • • 自动化程度高: 无需繁琐的注解(如 @Api@ApiModel),SpringDoc 能自动从你的 Spring Web 注解中推断出大量信息。

  • • 社区活跃: 项目正在积极开发和维护,能快速响应社区问题并跟进 Spring Boot 的更新。

2. 快速上手:三步集成交互式 API 文档

在 Spring Boot 项目中集成 SpringDoc 极其简单,真正做到了“开箱即用”。

第一步:添加依赖 (Maven)

只需在你的 pom.xml 中添加一个依赖即可。

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

如果你使用 WebFlux,请将 webmvc 替换为 webflux

第二步:运行你的 Spring Boot 应用

没错,就是这样。你不需要添加任何额外的注解或配置类,只需正常启动你的应用。

第三步:访问 API 文档

启动成功后,打开浏览器访问以下两个地址:

  1. 1. 交互式 UI 界面: http://localhost:8080/swagger-ui.html

  2. 2. OpenAPI 规范 (JSON格式): http://localhost:8080/v3/api-docs

你会看到一个由 Swagger UI 提供的、功能齐全的交互式文档页面。它已经自动扫描了你项目中所有的 @RestController,并将其API展示了出来。

(这是一个示例图片链接,实际效果类似)

3. 用注解“精雕细琢”你的 API 文档

自动生成的基础文档虽然可用,但缺少描述、示例等关键信息。为了让文档更专业、更易于理解,我们需要使用 OpenAPI 3 的注解来“精雕细琢”。

核心注解:

  • • @Tag: 用于为 Controller 进行分组和描述。

  • • @Operation: 用于描述一个具体的 API 操作(方法)。

  • • @Parameter: 用于描述一个方法的参数。

  • • @Schema: 用于描述一个模型(DTO/VO)或其属性。

  • • @ApiResponses / @ApiResponse: 用于描述可能的响应状态和内容。

实战示例:

UserDTO.java (数据传输对象)

import io.swagger.v3.oas.annotations.media.Schema;// 使用 @Schema 描述整个类
@Schema(description = "用户视图对象")
public class UserDTO {@Schema(description = "用户ID", example = "1001")private Long id;@Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "Alice")private String username;// ... Getters and Setters
}

UserController.java (控制器)

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
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 org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/api/users")
// 使用 @Tag 为整个 Controller 分组
@Tag(name = "用户管理", description = "提供用户的增删改查功能")
public class UserController {@GetMapping("/{id}")// 使用 @Operation 描述方法@Operation(summary = "根据ID获取用户", description = "传入用户ID,返回单个用户信息")// 使用 @Parameter 描述参数@Parameter(name = "id", description = "用户ID", required = true, example = "1001")// 使用 @ApiResponses 描述所有可能的响应@ApiResponses({@ApiResponse(responseCode = "200", description = "成功找到用户"),@ApiResponse(responseCode = "404", description = "用户未找到")})public UserDTO getUserById(@PathVariable Long id) {// ... 业务逻辑 ...return new UserDTO(id, "Alice");}@PostMapping@Operation(summary = "创建新用户")public UserDTO createUser(@RequestBody UserDTO user) {// ... 业务逻辑 ...return user;}
}

添加这些注解后,再次刷新 swagger-ui.html,你会发现文档变得极其清晰、专业,包含了分组、描述、示例值和所有可能的响应码。

4. 全局配置:打造专业的 API 门户

除了针对单个 API 的注解,我们还需要配置文档的全局信息,如标题、版本、联系人、安全认证方案等。推荐使用定义 OpenAPI Bean 的方式,因为它最灵活。

在任意 @Configuration 类中添加以下 Bean:

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class OpenApiConfig {@Beanpublic OpenAPI customOpenAPI() {// 定义 JWT Bearer 认证方案final String securitySchemeName = "bearerAuth";return new OpenAPI()// 1. 定义全局信息.info(new Info().title("我的应用 API").description("这是一个强大应用的 API 文档").version("v1.0.0"))// 2. 添加全局安全认证需求.addSecurityItem(new SecurityRequirement().addList(securitySchemeName))// 3. 在 Components 中定义安全认证方案的细节.components(new Components().addSecuritySchemes(securitySchemeName,new SecurityScheme().name(securitySchemeName).type(SecurityScheme.Type.HTTP).scheme("bearer").bearerFormat("JWT")));}
}

配置此 Bean 后,Swagger UI 的右上角会出现一个“Authorize”按钮,允许开发者输入 JWT Token,从而方便地测试需要认证的接口。

5. 进阶技巧与最佳实践

  • • 接口分组 (GroupedOpenApi): 如果你想为不同的 API 集合(如“对内API”和“对外API”)生成不同的文档,可以定义多个 GroupedOpenApi 类型的 Bean。

  • • 保护文档端点: 在生产环境中,API 文档不应公开访问。你需要使用 Spring Security 来保护 /swagger-ui.html 和 /v3/api-docs 等相关路径,只允许特定角色的用户访问。

  • • 利用校验注解: SpringDoc 会自动识别 JSR 303 / Jakarta Bean Validation 的注解(如 @NotNull@Size@Pattern),并将这些校验规则展示在文档中,这是非常有用的特性。

总结

在现代 Spring Boot 项目中,SpringDoc OpenAPI 已经不再是一个“锦上添花”的工具,而是保障团队高效协作、提升项目专业度的核心基础设施

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

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

相关文章

N4200EX是一款全智能超声波检测仪产品简析

N4200EX是一款全智能超声波检测仪&#xff0c;适用于石油、石化、天然气、气体生产等行业的压力管路、阀门、设备的各种防爆场合气体泄漏、真空泄漏、阀门内漏检测。●本安防爆设计&#xff0c;防爆、防尘、防水、抗摔。●适应恶劣环境&#xff0c;可在-25℃超低温环境检测&…

NestJS @Inject 装饰器入门教程

一、核心概念解析 1.1 依赖注入&#xff08;DI&#xff09;的本质 依赖注入是一种设计模式&#xff0c;通过 IoC&#xff08;控制反转&#xff09;容器管理对象生命周期。在 NestJS 中&#xff0c;Injectable() 标记的类会被容器管理&#xff0c;而 Inject() 用于显式指定依赖项…

网络地址详解

子网划分详解&#xff1a;从 IP 地址结构到实际应用 在计算机网络中&#xff0c;子网划分是一项关键的技术&#xff0c;它能帮助我们更高效地管理 IP 地址资源&#xff0c;优化网络性能。要深入理解子网划分&#xff0c;首先需要从 IP 地址的基本结构说起。 一、IPv4 地址的基…

吾日三省吾身 | 周反思 8.19

上周一览总体来说&#xff0c;上个周是一个被项目驱使而险些丧失自主思考能力的危险阶段。相比任何有机械化工作经验的读者都有类似的体验&#xff0c;在手上打螺丝的无尽循环中&#xff0c;自己的脑子就会逐渐丧失对自身的感知以及自主思考的能力。而这个负循环一旦开始&#…

08.19总结

连通性 在无向图中&#xff0c;若任意两点间均存在路径相连&#xff0c;则该图称为连通图。 若删除图中任意一个顶点后&#xff0c;剩余图仍保持连通性&#xff0c;则该图为点双连通图。 若删除图中任意一条边后&#xff0c;图仍保持连通性&#xff0c;则该图为边双连通图。 在…

车e估牵头正式启动乘用车金融价值评估师编制

8月13日&#xff0c;汽车金融行业职业能力评价规范编制启动工作会议在广州圆满落幕。本次会议由中国机械工业联合会机械工业人才评价中心主办&#xff0c;广州穗圣信息科技有限公司&#xff08;车e估&#xff09;承办。会议汇聚了众多行业精英&#xff0c;包括中国机械工业联合…

清空 github 仓库的历史提交记录(创建新分支)

想在 现有仓库中创建一个新分支 master&#xff0c;删除原来的 main&#xff0c;然后把 master 重命名为 main&#xff0c;并且清空历史。可以用下面一条完整的命令序列操作&#xff1a; # 1. 创建一个没有历史的新分支 master git checkout --orphan master# 2. 添加当前所有文…

使用B210在Linux下实时处理ETC专用短程通信数据(2)-CPU单核高速数据处理

在上一篇文章中&#xff0c;使用Octave初步验证了ETC车联数据的格式。然而&#xff0c;Octave无法实时处理20M的采样带宽。我们本节通过C语言&#xff0c;重写 Octave程序&#xff0c;实现实时处理&#xff0c;涉及下面三个关键特点。 文章目录1. 全静态内存2. 使用环状缓存3 无…

Spark 运行流程核心组件(二)任务调度

1、调度策略参数默认值说明spark.scheduler.modeFIFO调度策略&#xff08;FIFO/FAIR&#xff09;spark.locality.wait3s本地性降级等待时间spark.locality.wait.processspark.locality.waitPROCESS_LOCAL 等待时间spark.locality.wait.nodespark.locality.waitNODE_LOCAL 等待时…

Orbbec---setBoolProperty 快捷配置设备行为

在奥比中光&#xff08;Orbbec&#xff09;SDK&#xff08;通常称为ob库&#xff09;中&#xff0c;setBoolProperty函数是用于设置设备或传感器的布尔类型属性的核心接口。它主要用于开启/关闭设备的某些功能或模式&#xff0c;是配置设备行为的重要方法。 函数原型与参数解析…

[OWASP]智能体应用安全保障指南

1.关键组件定义 KC1 生成式语言模型&#xff08;Generative Language Models&#xff09; KC1.1 大语言模型&#xff08;LLMs&#xff09;&#xff1a;作为代理的“大脑”&#xff0c;基于预训练基础模型&#xff08;如 GPT 系列、Claude、Llama、Gemini&#xff09;&#xff…

【Vivado TCL 教程】从零开始掌握 Xilinx Vivado TCL 脚本编程(三)

【Vivado TCL 教程】从零开始掌握 Xilinx Vivado TCL 脚本编程&#xff08;三&#xff09; 系列文章目录 1、VMware Workstation Pro安装指南&#xff1a;详细步骤与配置选项说明 2、VMware 下 Ubuntu 操作系统下载与安装指南 3、基于 Ubuntu 的 Linux 系统中 Vivado 2020.1 下…

AI与大数据驱动下的食堂采购系统源码:供应链管理平台的未来发展

在数字化浪潮不断加速的今天&#xff0c;很多企业和机构都在追求一个目标&#xff1a;如何把“效率”与“成本”做到最佳平衡。对于学校、企事业单位的食堂来说&#xff0c;采购环节就是重中之重。往小了说&#xff0c;它关系到食堂员工的工作体验&#xff1b;往大了说&#xf…

HarmonyOS 实战:学会在鸿蒙中使用第三方 JavaScript 库(附完整 Demo)

摘要 在鸿蒙&#xff08;HarmonyOS NEXT / ArkTS&#xff09;开发中&#xff0c;我们大部分业务逻辑和 UI 都是用 ArkTS 写的。不过在做一些数据处理、网络请求、工具函数或者复杂算法时&#xff0c;完全没必要“重复造轮子”。这时候就可以直接引入 JavaScript 的第三方库。鸿…

C++实现教务管理系统,文件操作账户密码登录(附源码)

教务管理系统项目介绍 项目概述 这是一个基于C开发的教务管理系统&#xff0c;提供了学生、教师和系统管理员三种角色的功能模块&#xff0c;实现了教务信息的录入、查询、修改和删除等基本操作。系统采用文件存储方式保存数据&#xff0c;具有简单易用、功能完备的特点。 项…

《C++进阶之STL》【二叉搜索树】

【二叉搜索树】目录前言&#xff1a;------------概念介绍------------1. 什么是二叉搜索树?2. 二叉搜索树的性能怎么样&#xff1f;------------基本操作------------一、查找操作思想步骤简述二、插入操作目标步骤简述三、删除操作目标步骤简述------------代码实现--------…

Orange的运维学习日记--47.Ansible进阶之异步处理

Orange的运维学习日记–47.Ansible进阶之异步处理 文章目录Orange的运维学习日记--47.Ansible进阶之异步处理Playbook 执行顺序原理可选执行策略调整并发连接数&#xff1a;forks 参数查看与修改 forks性能调优建议分批执行全局任务&#xff1a;serial 关键字serial 用法示例应…

从一个ctf题中学到的多种php disable_functions bypass 姿势

题目介绍 题目是Lilctf2025 的php-jail-is-my-cry 比赛链接&#xff1a;https://lilctf.xinshi.fun/ 题目环境前半部分是 php最近的phar 新 trick 大佬的原理分析 https://fushuling.com/index.php/2025/07/30/%e5%bd%93include%e9%82%82%e9%80%85phar-deadsecctf2025-baby-we…

从繁琐到优雅:Java Lambda 表达式全解析与实战指南

在 Java 8 之前&#xff0c;我们习惯了用匿名内部类处理回调、排序等场景&#xff0c;代码中充斥着大量模板化的冗余代码。直到 Java 8 引入 Lambda 表达式&#xff0c;这一局面才得以彻底改变。作为一名深耕 Java 多年的技术专家&#xff0c;我见证了 Lambda 表达式如何从一个…

《当 AI 学会 “思考”:大语言模型的逻辑能力进化与隐忧》

引言&#xff1a;AI “思考” 的时代信号​大语言模型展现逻辑能力的典型场景&#xff1a;如复杂问题推理、多步骤任务规划的实例&#xff08;如 AI 辅助撰写科研思路、进行案件逻辑梳理等&#xff09;​提出核心议题&#xff1a;大语言模型逻辑能力的进化究竟达到了怎样的程度…