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

Spring Boot 3 + SpringDoc:打造接口文档

1、背景公司

新项目使用SpringBoot3.0以上构建,其中需要对外输出接口文档。接口文档一方面给到前端调试,另一方面给到测试使用。

2、SpringDoc 是什么?

SpringDoc 是一个基于 Spring Boot 项目的库,能够自动根据项目中的配置、类结构和注解生成 API 文档。

它遵循 OpenAPI 3 规范,通过检查运行中的程序,推断出 API 的语义,并以 JSON、YAML 和 HTML 格式输出文档。

这与我们熟知的 Swagger 项目有着紧密的联系。

Swagger 作为 OpenAPI 规范的前身,贡献了其 API 设计理念并促成了 OpenAPI 的标准化。

而 Springfox,作为 Swagger 的具体实现,曾在行业中占据主导地位,但自 2020 年停止更新后,逐渐被 SpringDoc 所取代。

SpringDoc 不仅支持最新的 OpenAPI 3 规范,还完美兼容 Spring Boot 3,成为新项目的首选工具。

3、核心概念

OpenAPI:是一个组织(OpenAPI Initiative),他们指定了如何描述HTTP API的规范(OpenAPI Specification)。既然是规范,那么谁想实现都可以,只要符合规范即可。

Swagger:它是SmartBear这个公司的一个开源项目,里面提供了一系列工具,包括著名的 swagger-ui。swagger是早于OpenApi的,某一天swagger将自己的API设计贡献给了OpenApi,然后由其标准化了。

Springfox:是Spring生态的一个开源库,是Swagger与OpenApi规范的具体实现。我们使用它就可以在spring中生成API文档。以前基本上是行业标准,目前最新版本可以支持 Swagger2, Swagger3 以及 OpenAPI3 三种格式。但是其从 2020年7月14号就不再更新了,不支持springboot3,所以业界都在不断的转向另一个库Springdoc。

SpringDoc:算是后起之秀,带着继任Springfox的使命而来。其支持OpenApi规范,支持Springboot3。

4、使用方法

4.1 简单集成
在 Spring Boot 项目中集成 SpringDoc 非常简单,只需在 pom.xml 文件中添加以下依赖即可:

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

运行项目后,访问 http://localhost:8080/swagger-ui.html 即可查看自动生成的 API 文档。

例如,我们有以下简单的控制器代码:。

@RestController
@RequestMapping("/api/programmer")
publicclassProgrammerController {@PostMapping()public Programmer createProgrammer(@RequestBody CreateProgrammerRequest request) {returnnewProgrammer(1, request.getAge(), request.getProgrammingLang());}@GetMapping("/{id}")public Programmer getProgrammer(@PathVariable Integer id) {returnnewProgrammer(1, 35, List.of("Java", "Python", "SQL"));}
}

注解:

  1. 使用 @RestController 注解标记该类为一个 REST 控制器。
  2. @RequestMapping(“/api/programmer”) 定义了该控制器的路径前缀。
  3. @PostMapping() 和 @GetMapping(“/{id}”) 分别定义了创建程序员和获取程序员的接口路径。

4.2 配置 SpringDoc
4.2.1 使用 YAML 配置
我们可以通过 YAML 文件对 SpringDoc 进行详细配置,例如:

springdoc:api-docs:enabled:trueswagger-ui:persistAuthorization:true
info:title:'程序员管理系统 API 文档'description:'用于管理程序员信息的系统'version:'v1.0'contact:name:张三email:zhangsan@example.comurl:https://example.com
components:security-schemes:apiKey:type:APIKEYin:HEADERname:Authorization
group-configs:-group:程序员管理packages-to-scan: com.example.programmer

注解:

  1. springdoc.api-docs.enabled:启用 API 文档。
  2. springdoc.info.*:配置文档的基本信息,如标题、描述、版本和联系人信息。
  3. springdoc.components.security-schemes:定义安全认证方式,如 API 密钥。
  4. springdoc.group-configs:按包路径对 API 进行分组。

4.2.2 使用 Java 配置
除了 YAML 配置,我们还可以通过 Java 代码进行更灵活的配置。

例如:

@Configuration
public class SpringDocConfig {@Beanpublic OpenAPI myOpenAPI() {returnnewOpenAPI().info(newInfo().title("程序员管理系统 API").description("用于管理程序员信息").version("v1.0").contact(newContact().name("张三").email("zhangsan@example.com"))).externalDocs(newExternalDocumentation().description("项目主页").url("https://example.com"));}
}

注解:

  1. 使用 @Configuration 注解标记该类为配置类。
  2. OpenAPI.info():配置文档的基本信息。
  3. OpenAPI.externalDocs():添加外部文档链接。

4.3 配置文档分组
如果项目中有多个模块,我们可以将 API 按模块分组。

例如:

@Configuration
public class SpringDocConfig {@Beanpublic GroupedOpenApi programmerApi() {return GroupedOpenApi.builder().group("程序员管理").pathsToMatch("/api/programmer/**").build();}@Beanpublic GroupedOpenApi adminApi() {return GroupedOpenApi.builder().group("管理员模块").pathsToMatch("/api/admin/**").build();}
}

注解:

  1. 使用 GroupedOpenApi.builder() 创建分组。
  2. pathsToMatch:指定该分组匹配的路径。

4.4 注解
SpringDoc 提供了丰富的注解来描述 API 的各个部分,以下是一些常用的注解:

• @Tag:用于控制器类,描述模块信息。
• @Operation:用于控制器方法,描述接口信息。
• @Parameter:用于方法参数,描述参数信息。
• @Schema:用于实体类及其属性,描述数据结构。
• @ApiResponse:用于描述接口的返回值。

例如:

@Tag(name = "程序员管理", description = "管理程序员信息")
@RestController
@RequestMapping("/api/programmer")
public class ProgrammerController {@Operation(summary = "创建程序员", description = "创建一个新的程序员")@PostMapping()public Programmer createProgrammer(@RequestBody CreateProgrammerRequest request) {returnnewProgrammer(1, request.getAge(), request.getProgrammingLang());}@Operation(summary = "获取程序员信息", description = "根据 ID 获取程序员信息")@GetMapping("/{id}")public Programmer getProgrammer(@Parameter(description = "程序员 ID") @PathVariable Integer id) {returnnewProgrammer(1, 35, List.of("Java", "Python", "SQL"));}
}

注解:

  1. @Tag:为整个控制器添加模块描述。
  2. @Operation:为每个接口方法添加详细描述。
  3. @Parameter:为方法参数添加描述。

SpringDoc 与 Knife4j 的整合

Knife4j 是一个增强版的 API 文档工具,它提供了更美观的 UI 和更多的功能。

SpringDoc 可以与 Knife4j 无缝整合,为开发者提供更好的体验。

5 1. Knife4j 的前世今生
Knife4j 前身是 swagger-bootstrap-ui,经过多次迭代,逐渐发展成为一个基于 Vue 和 Ant Design 的现代化 UI 工具。

它支持 OpenAPI 3 规范,并提供了丰富的功能,如分组管理、接口排序等。

5 2. Spring Boot 版本兼容性
Knife4j 提供了多个版本,以适配不同版本的 Spring Boot。

在这里插入图片描述

1. 添加依赖:

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

2. 配置 Knife4j:

springdoc:swagger-ui:path:/swagger-ui.htmltags-sorter:alphaoperations-sorter:alpha
api-docs:path:/v3/api-docs
group-configs:-group:'默认分组'paths-to-match:'/**'packages-to-scan:com.example.demoknife4j:
enable:true
setting:language: zh_cn

注解:

  1. springdoc.swagger-ui.path:指定 Swagger UI 的访问路径。
  2. knife4j.enable:启用 Knife4j 功能。
  3. knife4j.setting.language:设置文档语言。
  4. 使用 OpenAPI 3 规范注解:
@RestController
@RequestMapping("/api/programmer")
@Tag(name = "程序员管理", description = "管理程序员信息")
public class ProgrammerController {@Operation(summary = "创建程序员", description = "创建一个新的程序员")@PostMapping()public Programmer createProgrammer(@RequestBody CreateProgrammerRequest request) {returnnewProgrammer(1, request.getAge(), request.getProgrammingLang());}@Operation(summary = "获取程序员信息", description = "根据 ID 获取程序员信息")@GetMapping("/{id}")public Programmer getProgrammer(@Parameter(description = "程序员 ID") @PathVariable Integer id) {returnnewProgrammer(1, 35, List.of("Java", "Python", "SQL"));}
}

注解:

  1. 使用 @Tag 和 @Operation 注解描述控制器和接口。
  2. 使用 @Parameter 注解描述方法参数。

访问 http://localhost:8080/doc.html 即可查看 Knife4j 提供的增强版 API 文档。

相关文章:

  • FPGA学习——DE2-115开发板上设计波形发生器
  • 软件项目验收报告模板
  • 算法备案的审核标准是什么?
  • 全国青少年信息素养大赛 C++算法创意实践挑战赛初赛 集训模拟试卷《七》及详细答案解析
  • chkconfig指令
  • Windows程序包管理器WinGet实战
  • HarmonyOS 基础语法概述 UI范式
  • cmd查询占用端口并查杀
  • 推荐一款Umi-OCR_文字识别工具
  • 一个好用的高性能日志库——NanoLog
  • 【学习笔记】Py网络爬虫学习记录(更新中)
  • 【深度学习—李宏毅教程笔记】Self-attention
  • Selenium无法定位元素的几种解决方案
  • 柴油机气缸体顶底面粗铣组合机床总体及夹具设计
  • 初始图像学(6)
  • Spring Bean 全方位指南:从作用域、生命周期到自动配置详解
  • vulfocus-empirecms 文件上传 (CVE-2018-18086)漏洞复现详细教程
  • 通过C# 将Excel表格转换为图片(JPG/ PNG)
  • 第T7周:咖啡豆识别
  • day1-小白学习JAVA---JDK安装和环境变量配置(mac版)
  • 一周观展|上海,一系列特展大展渐次呈现
  • 成都一医院孕妇产下七胞胎?涉事医院辟谣:信息不实已举报
  • 泸州市长余先河已任四川省委统战部常务副部长
  • 工作坊|早期左翼文学的多重张力与历史回响
  • 中央宣传部原副部长张建春被提起公诉
  • 近千人认购!上海一新盘认购数创今年新高,3月份7个项目开盘“日光”