Java21 + SpringBoot3整合springdoc-openapi,自动生成在线接口文档,支持SpringSecurity和JWT认证方式
前言
近日心血来潮想做一个开源项目,目标是做一款可以适配多端、功能完备的模板工程,包含后台管理系统和前台系统,开发者基于此项目进行裁剪和扩展来完成自己的功能开发。
本项目为前后端分离开发,后端基于Java21
和SpringBoot3
开发,后端使用Spring Security
、JWT
、Spring Data JPA
等技术栈,前端提供了vue
、angular
、react
、uniapp
、微信小程序
等多种脚手架工程。
本文主要介绍在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-docs
和swagger-ui
的访问路径。
springdoc:
api-docs:
path: /v3/api-docs
swagger-ui:
path: /swagger-ui.html
设置api-docs
和swagger-ui
访问权限
如果项目中启用了权限控制,需要合理设置api-docs
和swagger-ui
相关资源的访问权限。比如笔者使用的spring-security
,将api-docs
和swagger-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为openApiSecurityScheme
的SecuritySchemes
,在后续章节的Controller类中使用。
修改Controller类和实体类
在Controller类和实体类中添加swagger相关注解。
- @Tag 用于标识controller
- @Operation 用于标识方法
- @Schema 用于标识实体类和实体类的属性
- @ApiResponse 用于标识请求的响应
- @Parameters和@Parameter 用于标识请求参数,@Parameter的name需要和变量的命名一致,@Parameter要放到函数形参前面
以下代码中@Operation
注解通过security
属性指定认证方式,openApiSecurityScheme
已在上文springdoc配置类中声明。
- 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);
}
}
- 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;
}
查看效果
- 访问
http://localhost:8080/v3/api-docs
可获取JSON格式的API文档。
- 访问
http://localhost:8080/swagger-ui.html
可直接在线测试API,在Authorize
弹窗中可以填入token用于模拟在线用户。
总结
本文简单介绍了一下OpenAPI、Swagger、Springfox和SpringDoc的相关概念,以及详细介绍了SpringBoot3
整合SpringDoc
的过程,如有错误,还望批评指正。
在后续实践中我也是及时更新自己的学习心得和经验总结,希望与诸位看官一起进步。
Java21 + SpringBoot3整合springdoc-openapi,自动生成在线接口文档,支持SpringSecurity和JWT认证方式的更多相关文章
- .NET Core WEB API使用Swagger生成在线接口文档
1项目引用Swashbuckle.AspNetCore程序集和Microsoft.Extensions.PlatformAbstractions程序集 右击项目打开"管理NuGet程序包.. ...
- Spring MVC学习总结(9)——Spring MVC整合swagger自动生成api接口文档
Swagger 号称:世界最流行的API框架,官网:http://swagger.io/,Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总 ...
- SpringBoot + Swagger2 自动生成API接口文档
spring-boot作为当前最为流行的Java web开发脚手架,相信越来越多的开发者会使用其来构建企业级的RESTFul API接口.这些接口不但会服务于传统的web端(b/s),也会服务于移动端 ...
- springboot项目利用Swagger2生成在线接口文档
Swagger简介. Swagger2是一款restful接口文档在线生成和在线调试工具.很多项目团队利用Swagger自动生成接口文档,保证接口文档和代码同步更新.在线调试.简单地说,你可以利用这个 ...
- SpringBoot整合knife4j框架(可生成离线接口文档),并设置接口请求头token默认值
功能和swagger类似 官网地址:https://doc.xiaominfo.com/knife4j/ 这个框架可以设置返回字段的描述 引入依赖 <dependency> <gro ...
- 第十二节:WebApi自动生成在线Api文档的两种方式
一. WebApi自带生成api文档 1. 说明 通过观察,发现WebApi项目中Area文件夹下有一个HelpPage文件夹,如下图,该文件夹就是WebApi自带的生成Api的方式,如果该文件夹没了 ...
- 利用ShowDoc自动生成api接口文档
最近在做新项目,感觉写完一个接口 还要去再写一遍api文档 挺浪费时间的,所以借用ShowDoc的api开放功能 自动生成api文档. 首先 去 https://www.showdoc.cc/ 注册一 ...
- 使用jsdoc-toolkit来自动生成js api文档
近来前端组小盆友开发的类库越来越多,很多情况下彼此不知道写了些什么方法,为了更好的合作提高工作效率,找了个比较好的api文档生成方法.使用jsdoc-toolkit来自动生成js api文档. 一. ...
- 使用swagger实现web api在线接口文档
一.前言 通常我们的项目会包含许多对外的接口,这些接口都需要文档化,标准的接口描述文档需要描述接口的地址.参数.返回值.备注等等:像我们以前的做法是写在word/excel,通常是按模块划分,例如一个 ...
- 使用swagger实现web api在线接口文档(转载)
一.前言 通常我们的项目会包含许多对外的接口,这些接口都需要文档化,标准的接口描述文档需要描述接口的地址.参数.返回值.备注等等:像我们以前的做法是写在word/excel,通常是按模块划分,例如一个 ...
随机推荐
- three.js 火焰效果
代码是网上找的代码,通过调参.修改.封装实现的. 代码: /** * 火焰 */ import * as THREE from '../build/three.module.js'; let MyFi ...
- POJ:3660 Cow Contest (传递闭包 + Floyd)
POJ 3660 http://poj.org/problem?id=3660 思路: 传递闭包 输入A > B,那么我们可以建立一套A ->B 的边. 然后求出传递闭包. 判断一个人是否 ...
- Windows环境下,解决无法使用ping命令
众所周知,ping命令是个非常实用的网络命令:有时,我们会发现在电脑中无法使用ping命令,一般来说,是由于电脑的环境变量出了问题,本文将介绍如何解决这个问题. 1.一般出现ping命令无法使用的情况 ...
- mysql和redis库存扣减和优化
前言 大流量情况下的库存是老生常谈的问题了,在这里我整理一下mysql和redis应对扣除库存的方案,采用jmeter进行压测. JMETER设置 库存初始值50,线程数量1000个,1秒以内启动全部 ...
- vue学习笔记 十六、params方式带参数的页面跳转
系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...
- 【内核】深入分析内核panic(三)--内核错误处理流程
1 内核错误处理方式 当内核出现致命错误时,只要cpu还能正常运行,那么最重要的就是向用户输出详细的错误信息,以及保存问题出现时的错误现场.以上致命错误可包含以下两种类型: (1)硬件能检测到的错误, ...
- C#设计模式06——适配器的写法
什么是适配器模式? 适配器模式是一种结构型设计模式,用于将现有接口转换为符合客户端期望的接口.适配器模式允许不兼容的类可以相互协作. 为什么需要适配器模式? 在实际开发中,经常会遇到需要复用一些已有的 ...
- 操作系统OS笔记2
操作系统OS笔记2 调度和死锁 调度简介 1. 调度的基本概念 2. 调度原则 调度算法 平均周转时间: 平均带权周转时间:周转时间/服务时间 1. 先来先服务调度算法(FCFS) 当在高级调度中采用 ...
- Shell 脚本编程学习
本文为博主原创,转载请注明出处: 目录: 1. shell 变量 2. 运算符 3. if 语句 4.for 循环 5.while 语句 6. case 语法 7.跳出循环:continue 与 br ...
- [转帖]nginx中的if和else语法
https://www.dyxmq.cn/it/nginx/nginx-if.html nginx支持if语法,语法和平常的代码格式差不多: 1 2 3 if ($xxx = xxx) { ...