Springfox迁移到 Springdoc OpenAPI 3
将项目从 Springfox 迁移到 Springdoc OpenAPI 3 时,主要的工作是将原先使用的 Springfox 注解替换为 Springdoc OpenAPI 3 中的对应注解。虽然 Springdoc OpenAPI 3 基于 OpenAPI 3 规范,并且有一些不同的命名方式和设计理念,但大部分注解的功能是类似的。
主要注解对比表
| 功能/注解 | Springfox 注解 | Springdoc OpenAPI 3 注解 |
|---|---|---|
| 接口文档描述 | @ApiOperation | @Operation |
| 接口文档描述(错误响应等) | @ApiResponses | @ApiResponses |
| 接口文档描述(单个响应) | @ApiResponse | @ApiResponse |
| 接口参数描述 | @ApiParam | @Parameter |
| 请求模型描述 | @ApiModel | @Schema |
| 响应模型描述 | @ApiModelProperty | @Schema |
| 类/接口文档描述 | @Api | @Tag |
| 全局文档描述 | @ApiOperation、@ApiResponses | @OpenAPIDefinition |
| 请求头描述 | @ApiImplicitParam | @RequestHeader |
Springfox 到 Springdoc 的主要迁移步骤与注解对比
1. @ApiOperation → @Operation
在 Springfox 中,@ApiOperation 用于描述 RESTful 接口的功能。Springdoc 使用 @Operation 代替。
Springfox 示例:
@ApiOperation(value = "获取用户信息", notes = "通过用户ID获取详细信息")
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {return userService.getUserById(id);
}
Springdoc 示例:
@Operation(summary = "获取用户信息", description = "通过用户ID获取详细信息")
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {return userService.getUserById(id);
}
2. @ApiResponses → @ApiResponses
@ApiResponses 在 Springfox 和 Springdoc 中的功能是相同的,用来描述接口的多个响应状态和返回类型。
Springfox 示例:
@ApiResponses({@ApiResponse(code = 200, message = "成功", response = User.class),@ApiResponse(code = 404, message = "用户未找到")
})
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {return userService.getUserById(id);
}
Springdoc 示例:
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "成功", content = @Content(mediaType = "application/json", schema = @Schema(implementation = User.class))),@ApiResponse(responseCode = "404", description = "用户未找到")
})
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {return userService.getUserById(id);
}
3. @ApiResponse → @ApiResponse
描述单个响应状态的注解在 Springfox 和 Springdoc 中是一致的。@ApiResponse 用于指定响应的代码、描述和返回的类型。
Springfox 示例:
@ApiResponse(code = 200, message = "成功", response = User.class)
public ResponseEntity<User> getUser(@PathVariable Long id) {return ResponseEntity.ok(userService.getUserById(id));
}
Springdoc 示例:
@ApiResponse(responseCode = "200", description = "成功", content = @Content(mediaType = "application/json", schema = @Schema(implementation = User.class)))
public ResponseEntity<User> getUser(@PathVariable Long id) {return ResponseEntity.ok(userService.getUserById(id));
}
4. @ApiParam → @Parameter
在 Springfox 中,@ApiParam 用于描述方法参数。在 Springdoc 中,使用 @Parameter 来描述。
Springfox 示例:
@GetMapping("/users")
public List<User> getUsers(@ApiParam(value = "分页参数", required = true) @RequestParam int page) {return userService.getUsers(page);
}
Springdoc 示例:
@GetMapping("/users")
public List<User> getUsers(@Parameter(description = "分页参数", required = true) @RequestParam int page) {return userService.getUsers(page);
}
5. @ApiModel 和 @ApiModelProperty → @Schema
Springfox 使用 @ApiModel 和 @ApiModelProperty 来描述请求体和响应体的模型属性。而在 Springdoc 中,这些都通过 @Schema 注解来完成。
Springfox 示例:
@ApiModel(description = "用户对象")
public class User {@ApiModelProperty(notes = "用户ID", required = true)private Long id;@ApiModelProperty(notes = "用户名", required = true)private String name;
}
Springdoc 示例:
@Schema(description = "用户对象")
public class User {@Schema(description = "用户ID", required = true)private Long id;@Schema(description = "用户名", required = true)private String name;
}
6. @Api → @Tag
@Api 用于描述整个类的 API 元信息。在 Springdoc 中,使用 @Tag 来替代它。
Springfox 示例:
@Api(tags = "用户管理 API")
@RestController
@RequestMapping("/users")
public class UserController {// Controller methods
}
Springdoc 示例:
@Tag(name = "用户管理 API")
@RestController
@RequestMapping("/users")
public class UserController {// Controller methods
}
7. @ApiImplicitParam → @RequestParam、@RequestHeader、@PathVariable 等
在 Springfox 中,@ApiImplicitParam 用于声明请求参数的元信息。在 Springdoc 中,这些信息通过 @RequestParam、@RequestHeader 和 @PathVariable 等注解直接在参数上描述。
Springfox 示例:
@ApiImplicitParam(name = "Authorization", value = "JWT token", required = true, paramType = "header")
@GetMapping("/profile")
public User getProfile(@RequestHeader("Authorization") String token) {return userService.getProfile(token);
}
Springdoc 示例:
@GetMapping("/profile")
public User getProfile(@RequestHeader(description = "JWT token", required = true) String token) {return userService.getProfile(token);
}
总结
Springdoc OpenAPI 3 中的注解与 Springfox 大致相同,主要的变化在于命名方式。以下是迁移时的关键对比:
| Springfox 注解 | Springdoc 注解 |
|---|---|
@ApiOperation | @Operation |
@ApiResponses | @ApiResponses |
@ApiResponse | @ApiResponse |
@ApiParam | @Parameter |
@ApiModel | @Schema |
@ApiModelProperty | @Schema |
@Api | @Tag |
@ApiImplicitParam | @RequestParam、@RequestHeader 等 |
迁移时,主要是将 Springfox 中的注解替换为 Springdoc 中对应的注解,并根据 OpenAPI 3 的规范调整 API 文档描述。
相关文章:
Springfox迁移到 Springdoc OpenAPI 3
将项目从 Springfox 迁移到 Springdoc OpenAPI 3 时,主要的工作是将原先使用的 Springfox 注解替换为 Springdoc OpenAPI 3 中的对应注解。虽然 Springdoc OpenAPI 3 基于 OpenAPI 3 规范,并且有一些不同的命名方式和设计理念,但大部分注解的…...
DIY-Tomcat part 3 实现对动态资源的请求
实现ServletRequest package connector;import javax.servlet.RequestDispatcher; import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i…...
3.10 内核 BUG_ON() at xfs_vm_writepage() -> page_buffers()
目录 前言 问题分析 page buffers创建 page buffers丢失 Write-Protect Dirty Page w/o Buffers 问题解决 前言 这个问题发生在3.10.0-514.el7上,并且在RHEL的知识库中快速找到了对应的案例以及解决方案,但是,理解问题如何发生和解决…...
CrystalDiskInfo:硬盘健康监测工具简介和下载
原论坛给你更好的阅读体验:CrystalDiskInfo:硬盘健康监测工具简介和下载 | 波波论坛 引言 在日常使用电脑时,硬盘的健康状态对于系统的稳定性和数据的安全性至关重要。硬盘出现故障可能会导致数据丢失,严重时甚至会使整个系统无…...
Flink cdc同步增量数据timestamp字段相差八小时(分析|解决)不是粘贴复制的!
问题 我使用flink cdc同步mysql到mysql遇到了timestamp字段缺少八小时的问题。很少无语,flink ,cdc,debezium时区都设置了,没有任何效果! 分析 问题出现在mysql binlog身上!!! 因为默认mysql会使用UTC来…...
【docker】9. 镜像操作与实战
镜像操作案例 查找镜像 docker search busybox下载镜像 docker pull busybox:1.36.0查看镜像及列表存储位置 rootLAPTOP-H2EI4I6A:~# docker images busybox REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 517b897a6a83 2 months a…...
js-显示转换(强制转换)与隐式转换,==与===区别
1.显示转换(强制转换)与隐式转换 1.1显示转换 常见的JavaScript强制转换示例。 (1) 一元加号、一元减号- 值是布尔值,true将被转换为1,false将被转换为0。 let a "123"; let b a; // b的值为123,类型为Nu…...
【通俗理解】步长和学习率在神经网络中是一回事吗?
【通俗理解】步长和学习率在神经网络中是一回事吗? 【核心结论】 步长(Step Size)和学习率(Learning Rate, LR)在神经网络中并不是同一个概念,但它们都关乎模型训练过程中的参数更新。 【通俗解释&#x…...
【PTA】【数据库】【SQL命令】编程题2
数据库SQL命令测试题2 测试题目录 10-1 查询“李琳”老师所授课程的课程名称10-2 查询成绩比所有课程的平均成绩高的学生的学号及成绩10-3 创建带表达式的视图StuView10-4 从视图PerView中查询数据10-5 查询工资高于在“HR”部门工作的所有员工的工资的员工信息10-6 查询选修的…...
Spring Boot林业产品推荐系统:用户指南
摘 要 网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。因此林业产品销售信…...
【Conda 】Conda 配置文件详解:优化你的包管理与环境设置
目录 引言一、什么是 .condarc 文件?二、.condarc 文件的详细解析与优化2.1 SSL 验证2.2 设置 Conda 下载源2.3 设置环境和包存储路径2.4 代理服务器设置2.5 连接超时设置2.6 显示频道 URL2.7 包版本与构建选择2.8 环境依赖性管理2.9 禁用默认包版本2.10 Conda 配置…...
win10中使用ffmpeg的filter滤镜
1 给视频加文字水印 1.1 添加播放时间 ffmpeg -i input.mp4 -vf "drawtextfontfileC\\:/Windows/fonts/consola.ttf:fontsize30:fontcolorwhite:timecode00\:00\:00\:00:rate25:textTCR\::boxcolor0x000000AA:box1:x20:y20" -y output.mp4 在视频的x20:y20位置添加t…...
设计模式 外观模式 门面模式
结构性模式-外观模式 门面模式 适用场景:如果你需要一个指向复杂子系统的直接接口, 且该接口的功能有限, 则可以使用外观模式。 不用关心后面的查询具体操作 /*** 聚合查询接口*/ RestController RequestMapping("/search") Slf…...
Prophet时间序列算法总结及python实现案例
目录 一、prophet理论总结二、python导入模块方式三、python实现案例3.1帮助信息3.2 案例 四、参考学习 一、prophet理论总结 prophet模型是facebook开源的一个时间序列预测算法。[1][2],该算法主要为处理具有周期性、趋势变化以及缺失值和异常值的时间序列数据而设…...
远程调用 rpc 、 open feign
在学习黑马 springcloud 视频的时候,看到 open feign 使用, 就是 http 封装。 spring框架三部曲,导入依赖,加配置,使用api。...
Redis的几种持久化方式
Redis 提供了两种主要的持久化方式,它们分别是: 1. RDB(Redis Database Snapshotting) RDB 是 Redis 的一种数据持久化方式,它会在指定的时间间隔内对 Redis 中的数据进行快照并保存到硬盘上。 特点: 触…...
论文笔记(五十九)A survey of robot manipulation in contact
A survey of robot manipulation in contact 文章概括摘要1. 引言解释柔顺性控制的概念:应用实例: 2. 需要接触操控的任务2.1 环境塑造2.2 工件对齐2.3 关节运动2.4 双臂接触操控 3. 接触操控中的控制3.1 力控制3.2 阻抗控制3.3 顺应控制 4. 接触操控中的…...
c#控制台程序26-30
26.寻找并输出11至999之间的数m,它满足m,m2和m3均为回文数。所谓回文数是指其各位数字左右对称的整数,例如121,676,94249等。满足上述条件的数如m11,m2121,m31331皆为回文数。请编制函数实现此功能,如果是回文数&#…...
环形链表系列导学
问题描述 给定一个单链表,可能存在一个环。我们的目标是找到环的入口节点,即从这个节点开始,链表进入循环。如果没有环,则返回 null。 将链表问题转化为数学问题 状态序列与循环 我们可以将链表节点视为状态,每个节点的 next 指针代表状态转移函数 f f f。从头节点开始,我…...
IDEA2024创建一个spingboot项目
以下是创建一个基本的 Spring Boot 项目的步骤和示例: 初始化一个springboot工程其实有许多方法,笔者这里挑了一个最快捷的方式搭建一个项目。我们直接通过官方平台(start.spring.io)进行配置,然后下载压缩包就可以获取…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
