前言

近日心血来潮想做一个开源项目,目标是做一款可以适配多端、功能完备的模板工程,包含后台管理系统和前台系统,开发者基于此项目进行裁剪和扩展来完成自己的功能开发。

本项目为前后端分离开发,后端基于Java21SpringBoot3开发,后端使用Spring SecurityJWTSpring Data JPA等技术栈,前端提供了vueangularreactuniapp微信小程序等多种脚手架工程。

本文主要介绍在SpringBoot3项目中如何整合springdoc-openapi实现自动生成在线接口文档,JDK版本是Java21

项目地址:https://gitee.com/breezefaith/fast-alden

相关技术简介

OpenAPI

OpenAPI 规范(OAS),是定义一个标准的、与具体编程语言无关的RESTful API的规范。OpenAPI 规范使得人类和计算机都能在“不接触任何程序源代码和文档、不监控网络通信”的情况下理解一个服务的作用。如果您在定义您的 API 时做的很好,那么使用 API 的人就能非常轻松地理解您提供的 API 并与之交互了。

如果您遵循 OpenAPI 规范来定义您的 API,那么您就可以用文档生成工具来展示您的 API,用代码生成工具来自动生成各种编程语言的服务器端和客户端的代码,用自动测试工具进行测试等等。

参考文档:OpenAPI 规范 (中文版) https://openapi.apifox.cn/

Swagger

Swagger是一套围绕 Open API 规范构建的开源工具,可以帮助设计,构建,记录和使用 REST API。

Swagger工具包括的组件:

  • Swagger Editor :基于浏览器编辑器,可以在里面编写 Open API规范。类似 Markdown 具有实时预览描述文件的功能。
  • Swagger UI:将 Open API 规范呈现为交互式 API 文档。用可视化UI 展示描述文件。
  • Swagger Codegen:将 OpenAPI 规范生成为服务器存根和客户端库。通过 Swagger Codegen 可以将描述文件生成 html 格式和 cwiki 形式的接口文档,同时也可以生成多种言语的客户端和服务端代码。
  • Swagger Inspector:和 Swagger UI 有点类似,但是可以返回更多信息,也会保存请求的实际参数数据。
  • Swagger Hub:集成了上面所有项目的各个功能,你可以以项目和版本为单位,将你的描述文件上传到 Swagger Hub 中。在 SwaggerHub 中可以完成上面项目的所有工作,需要注册账号,分免费版和收费版。

使用 Swagger,就是把相关的信息存储在它定义的描述文件里面(yml 或 json 格式),再通过维护这个描述文件可以去更新接口文档,以及生成各端代码。

官方文档:https://swagger.io/

Springfox

Springfox是一套可以帮助Java开发者自动生成API文档的工具,它是基于Swagger 2.x基础上开发的,它遵循的是OpenAPI2.0(即Swagger2.0规范)。Swagger已经成为了RESTful API文档生态系统的事实标准,而Springfox是一个用于集成Swagger2.x到Spring应用程序中的库。而且Springfox提供了一些注解来描述API接口、参数和返回值,并根据这些信息生成Swagger UI界面,从而方便其他开发人员查看和使用您的API接口。

此外,Springfox还支持自动生成API文档和代码片段,简化了开发人员的工作量。除了集成Swagger 2.x,Springfox还提供了一些额外功能,例如自定义Swagger文档、API版本控制、请求验证等等。这些功能使得Springfox可以胜任各种类型和规模的应用程序,同时还可以提高代码质量和开发效率。

总之,Springfox是一个非常有用的工具,它可以帮助Java开发者快速、简单地集成Swagger2.x,并为他们的应用程序生成高质量的API文档。无论您开发的是大型企业应用程序还是小型服务,使用Springfox都能够提高团队的生产力和代码质量。

官方文档:https://springfox.github.io/springfox/

springdoc

SpringDoc是基于OpenAPI 3.0规范构建的,因此推荐在Spring Boot 2.4及以上版本中使用springdoc-openapi-ui库来集成Swagger3.x。在这些版本中,springdoc-openapi-ui库已被广泛应用,并且得到了社区的大力支持和推广。而在Spring Boot 2.3及其以下版本,可以使用springfox-boot-starter库来集成Swagger2.x。

SpringDoc有着更加先进的技术架构和更好的扩展性,使得其逐渐取代了springfox-boot-starter工具包,成为了当前Spring Boot生态中最受欢迎的API文档工具之一。同时springdoc-openapi-ui还拥有更为完善的开发文档和社区支持,从而吸引了越来越多的开发者加入到这个项目中。因此作为一个Spring Boot开发者,如果想要快速、方便地生成符合OpenAPI 3.0规范的接口文档,建议使用springdoc-openapi-ui这个优秀的工具。

官方文档:https://springdoc.org/

swagger2与swagger3常用注解对比

swagger2 swagger3 注解位置
@Api @Tag(name = “接口类描述”) Controller 类
@ApiOperation @Operation(summary =“接口方法描述”) Controller 方法
@ApiImplicitParams @Parameters Controller 方法
@ApiImplicitParam @Parameter(description=“参数描述”) Controller 方法的 @Parameters 里
@ApiParam @Parameter(description=“参数描述”) Controller 方法的参数上
@ApiIgnore @Parameter(hidden = true) 或 @Operation(hidden = true) 或 @Hidden -
@ApiModel @Schema DTO类上
@ApiModelProperty @Schema DTO属性上

实现步骤

引入maven依赖

pom.xml中添加springdoc-openapi-starter-webmvc-ui以及相关依赖。

<dependencies>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.3.0</version>
</dependency>
<!-- 项目中使用了spring-security时可以引入此依赖 -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-security</artifactId>
<version>1.7.0</version>
</dependency>
<!-- 如果使用的是spring webflux而非spring-webmvc,则需要将springdoc-openapi-starter-webmvc-ui改为如下依赖 -->
<!-- <dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webflux-ui</artifactId>
<version>2.3.0</version>
</dependency> -->
</dependencies>

修改配置文件

application.yml中可以自定义api-docsswagger-ui的访问路径。

springdoc:
api-docs:
path: /v3/api-docs
swagger-ui:
path: /swagger-ui.html

设置api-docsswagger-ui访问权限

如果项目中启用了权限控制,需要合理设置api-docsswagger-ui相关资源的访问权限。比如笔者使用的spring-security,将api-docsswagger-ui相关资源设置为允许匿名访问,不需要认证授权。

@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// 将api-docs和swagger-ui相关资源设置为允许匿名访问
http.authorizeHttpRequests((authorizationManagerRequestMatcherRegistry) -> {
authorizationManagerRequestMatcherRegistry.requestMatchers("/v3/api-docs").permitAll();
authorizationManagerRequestMatcherRegistry.requestMatchers("/v3/api-docs/**").permitAll();
authorizationManagerRequestMatcherRegistry.requestMatchers("/swagger-ui.html").permitAll();
authorizationManagerRequestMatcherRegistry.requestMatchers("/swagger-ui/**").permitAll(); // 其余资源登录后方可访问
authorizationManagerRequestMatcherRegistry.anyRequest().authenticated();
}); // 其余spring security配置已省略
// ... return http.build();
}
}

定义springdoc配置类

@Configuration
public class SpringDocConfig {
/**
* 一个自定义的 OpenAPI 对象
*
* @return 一个自定义的 OpenAPI 对象
*/
@Bean
public OpenAPI customOpenApi() {
return new OpenAPI()
.components(new Components()
// 设置 spring security jwt accessToken 认证的请求头 Authorization: Bearer xxx.xxx.xxx
.addSecuritySchemes("openApiSecurityScheme", new SecurityScheme()
.type(SecurityScheme.Type.HTTP)
.bearerFormat("JWT")
.in(SecurityScheme.In.HEADER)
.name("Authorization")
.scheme("Bearer")))
// 设置标题、版本等信息
.info(new Info()
.title("Fast Alden权限管理系统")
.version("0.0.1-SNAPSHOT")
.description("")
.license(new License()
.name("Apache 2.0")
.url("https://www.apache.org/licenses/LICENSE-2.0.html")));
}
}

在上述代码中定义了一个key为openApiSecuritySchemeSecuritySchemes,在后续章节的Controller类中使用。

修改Controller类和实体类

在Controller类和实体类中添加swagger相关注解。

  • @Tag 用于标识controller
  • @Operation 用于标识方法
  • @Schema 用于标识实体类和实体类的属性
  • @ApiResponse 用于标识请求的响应
  • @Parameters和@Parameter 用于标识请求参数,@Parameter的name需要和变量的命名一致,@Parameter要放到函数形参前面

以下代码中@Operation注解通过security属性指定认证方式,openApiSecurityScheme已在上文springdoc配置类中声明。

  1. SysUserController.java
// SysUserController.java
@Tag(name = "SysUserController", description = "后台用户管理")
@RestController
@RequestMapping("/user")
public class SysUserController {
@Resource
private SysUserService userService; @Operation(summary = "根据ID查询", security = @SecurityRequirement(name = "openApiSecurityScheme"))
@GetMapping("/retrieve/{id}")
public SysUser retrieve(@PathVariable("id") Long id) {
return userService.retrieve(id);
} @Operation(summary = "创建用户", security = @SecurityRequirement(name = "openApiSecurityScheme"))
@PostMapping("/create")
public Long create(@RequestBody SysUser user) {
return userService.create(user).getId();
} @Operation(summary = "修改用户", security = @SecurityRequirement(name = "openApiSecurityScheme"))
@PutMapping("/update")
public void update(@RequestBody SysUser user) {
userService.update(user);
} @Operation(summary = "删除用户", security = @SecurityRequirement(name = "openApiSecurityScheme"))
@DeleteMapping("/remove")
public void remove(@RequestParam("ids") List<Long> ids) {
userService.remove(ids);
}
}
  1. SysUser.java
// SysUser.java
/**
* 用户实体类
*/
@Getter
@Setter
@Schema(description = "用户")
public class SysUser {
@Schema(description = "用户ID")
private Long id; @Schema(description = "用户名")
private String username; @Schema(description = "密码")
private String password; @Schema(description = "电话")
private String phone; @Schema(description = "个人介绍")
private String introduce; @Schema(description = "所属部门ID")
private Long departmentId;
}

查看效果

  1. 访问 http://localhost:8080/v3/api-docs可获取JSON格式的API文档。

  1. 访问 http://localhost:8080/swagger-ui.html可直接在线测试API,在Authorize弹窗中可以填入token用于模拟在线用户。

总结

本文简单介绍了一下OpenAPI、Swagger、Springfox和SpringDoc的相关概念,以及详细介绍了SpringBoot3整合SpringDoc的过程,如有错误,还望批评指正。

在后续实践中我也是及时更新自己的学习心得和经验总结,希望与诸位看官一起进步。

Java21 + SpringBoot3整合springdoc-openapi,自动生成在线接口文档,支持SpringSecurity和JWT认证方式的更多相关文章

  1. .NET Core WEB API使用Swagger生成在线接口文档

    1项目引用Swashbuckle.AspNetCore程序集和Microsoft.Extensions.PlatformAbstractions程序集 右击项目打开"管理NuGet程序包.. ...

  2. Spring MVC学习总结(9)——Spring MVC整合swagger自动生成api接口文档

    Swagger 号称:世界最流行的API框架,官网:http://swagger.io/,Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总 ...

  3. SpringBoot + Swagger2 自动生成API接口文档

    spring-boot作为当前最为流行的Java web开发脚手架,相信越来越多的开发者会使用其来构建企业级的RESTFul API接口.这些接口不但会服务于传统的web端(b/s),也会服务于移动端 ...

  4. springboot项目利用Swagger2生成在线接口文档

    Swagger简介. Swagger2是一款restful接口文档在线生成和在线调试工具.很多项目团队利用Swagger自动生成接口文档,保证接口文档和代码同步更新.在线调试.简单地说,你可以利用这个 ...

  5. SpringBoot整合knife4j框架(可生成离线接口文档),并设置接口请求头token默认值

    功能和swagger类似 官网地址:https://doc.xiaominfo.com/knife4j/ 这个框架可以设置返回字段的描述 引入依赖 <dependency> <gro ...

  6. 第十二节:WebApi自动生成在线Api文档的两种方式

    一. WebApi自带生成api文档 1. 说明 通过观察,发现WebApi项目中Area文件夹下有一个HelpPage文件夹,如下图,该文件夹就是WebApi自带的生成Api的方式,如果该文件夹没了 ...

  7. 利用ShowDoc自动生成api接口文档

    最近在做新项目,感觉写完一个接口 还要去再写一遍api文档 挺浪费时间的,所以借用ShowDoc的api开放功能 自动生成api文档. 首先 去 https://www.showdoc.cc/ 注册一 ...

  8. 使用jsdoc-toolkit来自动生成js api文档

    近来前端组小盆友开发的类库越来越多,很多情况下彼此不知道写了些什么方法,为了更好的合作提高工作效率,找了个比较好的api文档生成方法.使用jsdoc-toolkit来自动生成js api文档. 一.  ...

  9. 使用swagger实现web api在线接口文档

    一.前言 通常我们的项目会包含许多对外的接口,这些接口都需要文档化,标准的接口描述文档需要描述接口的地址.参数.返回值.备注等等:像我们以前的做法是写在word/excel,通常是按模块划分,例如一个 ...

  10. 使用swagger实现web api在线接口文档(转载)

    一.前言 通常我们的项目会包含许多对外的接口,这些接口都需要文档化,标准的接口描述文档需要描述接口的地址.参数.返回值.备注等等:像我们以前的做法是写在word/excel,通常是按模块划分,例如一个 ...

随机推荐

  1. #2028:Lowest Common Multiple Plus(n个数的最小公倍数)

    Problem Description 求n个数的最小公倍数. Input 输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数. Output 为每组测试数据输出它们的最小公倍数 ...

  2. 一、java发送http的各类请求

    导航 一.java发送http的各类请求 二.java发送https的各类请求 java开发中需要调用其他服务的对外提供的http请求可以参考如下代码: 注:调用的主类比较简单就不写了. pom.xm ...

  3. centos7.9 安装oracle11g

    安装环境: 操作系统:CentOS Linux release 7.9.2009 (Core)orcle安装包:linux.x64_11gR2_database_1of2.zip. linux.x64 ...

  4. Tmux | 常用操作存档

    (因为自己实在是太好忘了,所以在博客存档方便查找) 参考资料:Tmux 使用教程 | 阮一峰的网络日志 tmux new -s <session-name> <Ctrl+B D> ...

  5. 13个构建RESTful API的最佳实践

    前言 Facebook.GitHub.Google和其他许多巨头都需要一种方法来服务和消费数据.在今天的开发环境中,RESTful API仍然是服务和消费数据的最佳选择之一. 但你是否考虑过学习行业标 ...

  6. 01-Shell脚本入门

    1.Shell介绍 1.1 疑问 linux系统是如何操作计算机硬件CPU,内存,磁盘,显示器等? 答: 使用linux的内核操作计算机的硬件 1.2 Shell介绍 通过编写Shell命令发送给li ...

  7. 问题--flask无法发邮件,无法登录

    1.问题 早上测试项目的时候,一直无法正确发送邮件,无法接收,但是查不出原因是什么 2.解决 改变了一下思路,去登录了不需要邮件验证码的用户,发现错误 这个错误提示是一个数据库连接错误,表明应用程序无 ...

  8. Oracle实例的启动和关闭

    启动模式 1.NoMount 模式(启动实例不加载数据库) 命令:startup nomount 讲解:这种启动模式只会创建实例,并不加载数据库,Oracle仅为实例创建各种内存结构和服务进程,不会打 ...

  9. [转帖]一文说清 Linux System Load

    https://zhuanlan.zhihu.com/p/447661302 双十一压测过程中,常见的问题之一就是load 飙高,通常这个时候业务上都有受影响,比如服务rt飙高,比如机器无法登录,比如 ...

  10. [转帖]tidb Modify Configuration Dynamically

    https://docs.pingcap.com/tidb/v6.5/dynamic-config This document describes how to dynamically modify ...