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

news/2025/2/22 14:40:41

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);
  }

  @Bean
  public 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 {

    @Autowired
    private 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.niftyadmin.cn/n/5862401.html

相关文章

【C++笔记】C+11深度剖析(三)

【C笔记】C11深度剖析(三) &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】C11深度剖析(三)前言一. lambda1.1 lambda表达式语法1.2 捕捉列表1.3 lambda的原理 二.新的类功能2.1 默认的移动构造和移动赋值2.2 成员变…

DeepSeek04-导出导入模型文件

一、导出备份模型&#xff1a; 预制条件&#xff1a; 安装了“Git Bash”&#xff0c;需要使用该软件&#xff0c;具体安装教程参见&#xff1a; 超级详细的GitBash使用教程01 查看有哪些模型&#xff1a; ollama list备份模型&#xff1a; 自己编写脚本back_model.sh&#xf…

I²C简介

前言 IC&#xff08;Inter-Integrated Circuit, 内置集成电路&#xff09;总线是由Philips公司&#xff08;现属于恩智浦&#xff09;在上世纪80年代开发的两线式串行通信总线&#xff0c;用于连接微控制器及其外围设备&#xff0c;控制设备之间的通信。 IC总线的物理拓扑示意…

【CXX】4.1 CXX与Cargo集成配置详解

一、规范设置 在Rust项目中&#xff0c;为了与C代码进行互操作&#xff0c;cxx crate提供了一种便捷的方式。通过cxx-build crate&#xff0c;Cargo可以被扩展为一个C构建系统。这在Cargo.toml文件中通过设置依赖来实现&#xff1a; [dependencies] cxx "1.0"[bui…

Grok 3 开源体验与访问指南

目录 Grok 3 开源体验与访问指南 前言 Grok 3 是什么&#xff1f; 如何访问 Grok 3&#xff1f; 我的初步体验 开源的意义 结语 Grok 3 开源体验与访问指南 前言 就在今天&#xff08;2025年2月20日&#xff09;&#xff0c;埃隆马斯克的 xAI 宣布 Grok 3 正式开源&#…

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

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

Lua C API :使用 lua_tonumber 函数从 Lua 栈中提取数值

lua_tonumber 是 Lua C API 中的一个重要函数&#xff0c;用于从 Lua 栈中提取数值并将其转换为 C 中的 lua_Number 类型。这个函数非常有用&#xff0c;尤其是在 C 与 Lua 交互时&#xff0c;能够轻松地从 Lua 环境中获取数值并进行处理。 函数原型 lua_Number lua_tonumber…

Go 语言结合 Redis 实现固定窗口、滑动窗口、令牌桶和漏桶限流算法的示例代码

固定窗口算法 原理&#xff1a;将时间划分为固定大小的窗口&#xff0c;在每个窗口内对请求进行计数。如果请求数超过设定的阈值&#xff0c;则拒绝后续请求&#xff0c;直到进入下一个窗口。代码&#xff1a; package mainimport ("fmt""time""git…