Spring Boot集成Swagger API文档:傻瓜式零基础教程

embedded/2025/2/23 0:40:28/

Springfox Swagger 是一个用于构建基于 Spring Boot 的 RESTful API 文档的开源工具。它通过使用注解来描述 API 端点,自动生成易于阅读和理解的 API 文档。Springfox 通过在运行时检查应用程序,基于 Spring 配置、类结构和各种编译时 Java 注释来推断 API 语义。

在 Java 项目中使用 Springfox 有以下好处:

  1. 自动生成 API 文档:Springfox 可以帮助我们自动生成描述 API 的 JSON 文件(Swagger 2.0规范),这使得 API 文档的编写变得非常容易和高效。
  2. 可视化 API 文档:Springfox 还提供了一个 Swagger UI,可以将 API 规范以交互式文档的形式展示出来,使得开发者和用户可以更加直观地理解和使用 API。
  3. 减少重复劳动:使用 Springfox 可以减少开发人员编写和维护 API 文档的工作量,从而提高开发效率。

需要注意的是,Springfox 3.x 版本已经移除了对 Guava 和其他第三方库的依赖,因此如果之前使用了 Guava predicates/functions,需要将其转换为 Java 8 函数接口。同时,在 SpringBoot 项目中整合 Springfox 通常需要用到两个依赖:springfox-swagger2 和 springfox-swagger-ui。

快速上手 springfox

安装依赖

如果是新项目,添加以下为 maven 依赖

<dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version>
</dependency>

Gradle 则添加这个

  implementation "io.springfox:springfox-boot-starter:<version>"

Swagger 配置入口


@SpringBootApplication
@EnableSwagger2 //支持 swagger 2.0 spec
@EnableOpenApi //支持 open api 3.0.3 spec
public class Application {public static void main(String[] args) {ApplicationContext ctx = SpringApplication.run(Application.class, args);}@Beanpublic PetController petController() {return new PetController();}

引入 swagger UI

<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>3.0.0</version>
</dependency>

设置 Swagger UI 静态资源目录


@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}

试试修改 Controller

@RestController
public class CustomController {@RequestMapping(value = "/custom", method = RequestMethod.POST)public String custom() {return "custom";}
}

Entity 校验

@Entity
public class User {//...@NotNull(message = "First Name cannot be null")private String firstName;@Min(value = 15, message = "Age should not be less than 15")@Max(value = 65, message = "Age should not be greater than 65")private int age;
}

浏览器验证 Json 文件

访问 http://localhost:8080/api/v2/api-docs,如果配置没问题的话,就可以拿到 swagger spec 文件。

访问 http://localhost:8080/swagger-ui/ 看是否能够看到 Swagger UI。

Swagger UI

Swagger UI

示例代码

以下是一个基于 Springfox Swagger 的代码示例:

@RestController
@RequestMapping("/api/v1/users")
@Api(tags = "User Management", description = "Operations for managing users")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")@ApiOperation(value = "Get user by ID", notes = "Get the user information by user ID")@ApiResponses(value = {@ApiResponse(code = 200, message = "Successfully retrieved user information"),@ApiResponse(code = 404, message = "User not found"),@ApiResponse(code = 500, message = "Internal server error")})public ResponseEntity<User> getUserById(@PathVariable("id") Long id) {User user = userService.getUserById(id);if (user == null) {return ResponseEntity.notFound().build();}return ResponseEntity.ok(user);}@PostMapping@ApiOperation(value = "Create user", notes = "Create a new user with the given user information")@ApiResponses(value = {@ApiResponse(code = 201, message = "Successfully created user"),@ApiResponse(code = 400, message = "Invalid request body"),@ApiResponse(code = 500, message = "Internal server error")})public ResponseEntity<User> createUser(@RequestBody @Valid User user) {User newUser = userService.createUser(user);return ResponseEntity.created(URI.create("/api/v1/users/" + newUser.getId())).body(newUser);}@PutMapping("/{id}")@ApiOperation(value = "Update user", notes = "Update an existing user with the given user information")@ApiResponses(value = {@ApiResponse(code = 200, message = "Successfully updated user"),@ApiResponse(code = 400, message = "Invalid request body"),@ApiResponse(code = 404, message = "User not found"),@ApiResponse(code = 500, message = "Internal server error")})public ResponseEntity<User> updateUser(@PathVariable("id") Long id, @RequestBody @Valid User user) {User updatedUser = userService.updateUser(id, user);if (updatedUser == null) {return ResponseEntity.notFound().build();}return ResponseEntity.ok(updatedUser);}@DeleteMapping("/{id}")@ApiOperation(value = "Delete user", notes = "Delete an existing user by user ID")@ApiResponses(value = {@ApiResponse(code = 204, message = "Successfully deleted user"),@ApiResponse(code = 404, message = "User not found"),@ApiResponse(code = 500, message = "Internal server error")})public ResponseEntity<Void> deleteUser(@PathVariable("id") Long id) {boolean deleted = userService.deleteUser(id);if (deleted) {return ResponseEntity.noContent().build();}return ResponseEntity.notFound().build();}
}

在上述示例代码中,使用了多个注解来描述 API 端点,例如:

  • @RestController:标识该类为一个 RESTful API 的控制器。
  • @RequestMapping:标识该控制器中所有 API 端点的基本路径。
  • @GetMapping@PostMapping@PutMapping@DeleteMapping:分别表示 GET、POST、PUT 和 DELETE 请求的 API 端点。
  • @Api:用于为该控制器中所有 API 端点添加一个描述性的标签和说明。
  • @ApiOperation:用于为单个 API 端点添加一个描述性的标签和说明。
  • @ApiResponses:用于为单个 API 端点添加一个或多个可能的响应消息。

除了上述注解之外,示例代码还包括了其他的注解,如 @PathVariable@RequestBody@Valid 等。这些注解用于描述 API 端点的输入参数和返回结果。

在添加了注解之后,开发人员可以使用 Springfox Swagger 来自动生成 API 文档。例如,通过访问 /v2/api-docs 端点,可以获取生成的 Swagger JSON 文件。另外,通过访问 /swagger-ui.html 端点,可以获取一个可视化的 Swagger UI 界面,用于查看和测试 API 端点。

好用的 API 开发者工具

Springfox Swagger 是一个功能强大的工具,但也有一些缺点:

  1. 学习成本高:使用 Springfox Swagger 需要掌握大量的注解和配置,这需要一定的学习成本。特别是对于初学者来说,可能需要花费更多的时间来了解和掌握 Springfox Swagger 的使用方法。
  2. 文档生成的细节有限制:虽然 Springfox Swagger 能够自动生成 API 文档,但是文档生成的细节受到限制,无法自动识别一些细节,例如 API 端点间的依赖关系、数据模型的细节等。这些需要开发者手动进行配置。
  3. API 文档维护需谨慎:API 文档的内容需要和代码一致,如果开发者没有及时更新 API 文档,就可能导致文档和实际代码不一致,增加维护的难度。
  4. 不支持自定义文档:尽管 Springfox Swagger 提供了多种自定义主题和样式的选项,但仍存在一些自定义文档的需求无法满足。例如,开发者可能需要根据特定的需求,生成自己定制的 API 文档,而这是不容易实现的。
  5. 增加应用程序复杂度:在将 Springfox Swagger 集成到应用程序中时,需要增加一些配置和注解,这可能会增加应用程序的复杂度。这也可能会增加代码的维护成本,特别是在大型项目中。

对于开发者,我们更推荐一体化 API 工具 Apifox:Apifox 是一个接口管理、开发、测试全流程集成工具,可以通过一套系统、一份数据解决多个系统之间的 API 数据同步问题。Apifox 提供的功能包括接口文档管理、接口调试、数据 Mock、接口测试等,可以帮助团队提高效率,降低沟通成本。 此外,Apifox 还有许多创新功能,如接口支持用例管理、接口支持分组管理、多人协作编辑等,都可以提高团队的开发效率。

立即体验 Apifox

一体化 API 工具 Apifox

同时 Apifox 还提供了基于 IDEA 的插件 Apifox Helper,在 IDEA 写好代码后,可以基于插件自动生成 API 文档,对于很多苦恼于如何从代码生成规范 API 文档的开发者来说,开箱即用更易用。

 IDEA 的插件 Apifox Helper

它不仅仅是一个数据打通的工具,还做了很多创新,来提升开发人员的效率。由于其功能全面、工作流逻辑清晰,支持多场景使用,以及对用户的上心程度,Apifox 受到高效能软件团队的喜爱。

好用的 API 开发者工具

与其他接口管理工具相比,Apifox 在产品本身的功能全面性、工作流逻辑清晰性以及多场景使用方面都表现出色。此外,Apifox 对用户的上心程度也很高,对用户提出的需求也会关注并且采纳。

立即体验 Apifox

Apifox 在产品本身的功能全面


http://www.ppmy.cn/embedded/164482.html

相关文章

Javascript网页设计案例:通过PDFLib实现一款PDF分割工具,分割方式自定义-完整源代码,开箱即用

功能预览 一、工具简介 PDF 分割工具支持以下核心功能: 拖放或上传 PDF 文件:用户可以通过拖放或点击上传 PDF 文件。两种分割模式: 指定范围:用户可以指定起始页和结束页,提取特定范围的内容。固定间距:用户可以设置间隔页数(例如每 5 页分割一次),工具会自动完成分…

deepseek清华大学第二版 如何获取 DeepSeek如何赋能职场应用 PDF文档 电子档(附下载)

deepseek清华大学第二版 DeepSeek如何赋能职场 pdf文件完整版下载 https://pan.baidu.com/s/1aQcNS8UleMldcoH0Jc6C6A?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/3ee62050a2ac

【电机控制器】ESP32-C3语言模型——豆包

【电机控制器】ESP32-C3语言模型——豆包 文章目录 [TOC](文章目录) 前言一、简介二、代码三、实验结果四、参考资料总结 前言 使用工具&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、简介 二、代码 #include <WiFi.h> #inc…

Unity 淡入淡出

淡入&#xff08;Fade in&#xff09;&#xff1a;类似打开幕布 淡出&#xff08;Fade out&#xff09;&#xff1a;类似关上幕布 方案一 使用Dotween&#xff08;推荐&#xff09; using DG.Tweening; using UnityEngine; using UnityEngine.UI;public class Test : MonoB…

【git-hub项目:YOLOs-CPP】本地实现05:项目移植

ok&#xff0c;经过前3个博客&#xff0c;我们实现了项目的跑通。 但是&#xff0c;通常情况下&#xff0c;我们的项目都是需要在其他电脑上也跑通&#xff0c;才对。 然而&#xff0c;经过测试&#xff0c;目前出现了2 个bug。 项目一键下载【⬇️⬇️⬇️】&#xff1a; 精…

C# dynamic 关键字 使用详解

总目录 前言 dynamic 是 C# 4.0 引入的关键字&#xff0c;用于声明动态类型&#xff0c;允许在运行时解析类型和成员&#xff0c;而非编译时。它主要设计用于简化与动态语言&#xff08;如 Python、JavaScript&#xff09;的交互、处理未知结构的数据&#xff08;如 JSON、XML…

[M二分] lc2080. 区间内查询数字的频率(模拟+二分+数据结构+Go二分库函数+知识总结)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;2080. 区间内查询数字的频率 相关&#xff1a; [M二分] lc34. 在排序数组中查找元素的第一个和最后一个位置(二分经典) 题单&#xff1a; 待补充 2. 题目解析 本题其实思路很简单的&#xff0c;但是在代码…

网络通信-最大传输单元-MTU,网络安全零基础入门到精通实战教程!

文章目录 MTU 引用MTU 介绍 定义MTU 与 VLAN TagVLAN Tag 处理方式 IP分片可靠传输MTU 之 PMTUD PMTUD介绍IP头的DF分片位 DF 0 可以分片DF 1 不可以分片 注意事项 MTU 引用 以太网最初对报文长度没有限制&#xff0c;网络层最大可以接收65535个字节&#xff0c;但是以太…