这篇文章资料来自于网络,对部分知识整理,这里只是记录一下,仅供参考

为什么要用 Swagger

        Swagger 的核心思想是通过定义和描述 API 的规范、结构和交互方式,以提高 API 的可读性、可靠性和易用性,同时降低 API 开发的难度和开发者之间的沟通成本。

        这里我采用了 Swagger3.0(Open API 3.0)的方式集成到 SpringBoot。springfox-boot-start 和 springfox-swagger2 都是基于 Swagger2.x 的。

        这里将介绍 springdoc-openapi-ui,它是 SpringBoot 基于 Open API 3.0(Swagger3.0)

SpringFox 与 Swagger 的关系

        Springfox 是一套可以帮助 Java 开发者自动生成 API 文档的工具,它是基于 Swagger 2.x 基础上开发的。

        除了集成 Swagger 2.x,Springfox 还提供了一些额外功能,例如自定义 Swagger 文档、API 版本控制、请求验证等等。

但是随着时间的推移,Swagger2.x 终究成为历史,所以我们可以看出 springfox-boot-starter 的坐标从 3.0.0 版本(2020 年 7 月 14 日)开始就一直没有更新; 也得注意的是 springfox-swagger2 坐标和 springfox-boot-start 是一样的,但 springfox-boot-start 只有 3.0.0 版本。这里我就不在使用 Swagger2.x 版本

添加依赖

由于篇幅原因,其他web项目相关依赖这里就不一一贴出来了。

第一个依赖是必须的,而且版本必须大于2.0.0

<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.2.0</version>
</dependency>
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-api</artifactId><version>2.2.0</version>
</dependency>

注:

        我们这里使用的是jdk17+springboot3.5.0 环境,原来swaggerV2V3都不能用了,小伙伴们一定更要注意这儿

不能引入的依赖

        如果引入上面错误的依赖,项目启动会报下面错误,这时候我们引入上面正确的依赖重新启动项目即可

报错信息

SpringDoc(推荐)

        SpringDoc 对应坐标是 springdoc-openapi-ui,它是一个集成 Swagger UI 和 ReDoc 的接口文档生成工具,在使用上与 springfox-boot-starter 类似,但提供了更为灵活、功能更加强大的工具。

        其中除了可以生成 Swagger UI 风格的接口文档,还提供了 ReDoc 的文档渲染方式,可以自动注入 OpenAPI 规范的 JSON 描述文件,支持 OAuth2、JWT 等认证机制,并且支持全新的 OpenAPI 3.0 规范

SpringBoot 3 集成 Swagger3.0

        需要注意的是,我们一般不会选择原生的 Swagger maven 坐标来集成 Swagger。而是通过 springdoc-openapi-ui 的 Maven 坐标。

        它可以很好的和 Spring 或 SpringBoot 项目集成;这个坐标也被 Spring 社区广泛支持和认可,并被认为是集成 Swagger UI 和 OpenAPI 规范的一个优秀选择。

引入 Maven

在该示例中,我使用 Spring Boot 3.0.2 集成 Swagger 3.0。

        springdoc-openapi-starter-webmvc-ui:目前最新版本是 2.6.0,适用于 Spring Boot 3.x 和 Spring Framework 6。支持 Jakarta 命名空间(例如,jakarta.validation),适合 Spring Boot 3 的 Jakarta EE 转换。

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>

配置 SwaggerOpenApiConfig

我们通过配置类的方式创建一个 OpenAPI 的 Bean 对象就可以创建 Swagger3.0 的文档说明。

import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class Swagger3Config {@Beanpublic OpenAPI springShopOpenAPI() {return new OpenAPI().info(new Info().title("码哥跳动 Swagger3 详解").description("Swagger3 Spring Boot 3.0 application").version("v0.0.1").license(new License().name("Apache 2.0").url("http://springdoc.org"))).externalDocs(new ExternalDocumentation().description("swagger 3 详解").url("https://springshop.wiki.github.org/docs"));}}

        OpenAPI 对象是 Swagger 中的核心类之一,用于描述整个 API 的结构和元数据。

        Swagger2 和 Swagger3 使用的是完全不同的两套注解,所以原本使用 Swagger2 相关注解的代码页需要完全迁移,改为使用 Swagger3 的注解。

Swagger2

Swagger3

@Api

@Tag

@ApiOperation

@Operation

@ApiImplicitParams

@Parameters

@ApiImplicitParam

@Parameter

@ApiModel

@Schema

@ApiModelProperty

@Schema

@ApiResponses

@ApiResponses

@ApiResponse

@ApiResponse

@ApiIgnore

@Hidden 或者 其他注解的 hidden = true 属性

配置文件

        通过以下配置来控制 swagger 的开关和访问地址:WEB 界面的显示基于解析 JSON 接口返回的结果, 如果 api-docs 关闭, swagger-ui 即使 enable 也无法使用。

server:port: 8013spring:application:name: magebyte-swaggerspringdoc:api-docs:enabled: true # 开启OpenApi接口path: /v3/api-docs  # 自定义路径,默认为 "/v3/api-docs"swagger-ui:enabled: true # 开启swagger界面,依赖OpenApi,需要OpenApi同时开启path: /swagger-ui.html # 自定义路径,默认为"/swagger-ui/index.html"# Packages to include,多个用 , 分割packagesToScan: zero.magebyte.magebyte.swagger.controller

需要注意的是,packagesToScan 用于指定 Controller 接口包路径。

@Schema

Swagger3 用 @Schema 注解对象和字段, 以及接口中的参数类型。

@Setter
@Getter
@Schema(description = "响应返回数据对象")
public class Result<T> implements Serializable {@Schema(title = "code",description = "响应码",format = "int32",requiredMode = Schema.RequiredMode.REQUIRED)private Integer code;@Schema(title = "msg",description = "响应信息",accessMode = Schema.AccessMode.READ_ONLY,example = "成功或失败",requiredMode = Schema.RequiredMode.REQUIRED)private String message;@Schema(title = "data", description = "响应数据", accessMode = Schema.AccessMode.READ_ONLY)private T data;
}

返回对象定义

@Data
@AllArgsConstructor
@Schema(title = "学生模型VO", description = "响应视图学生模型VO")
public class StudentVO implements Serializable {@Schema(name = "学生ID", description = "学生ID属性", format = "int64", example = "1")private Long id;            // 学生ID@Schema(name = "学生姓名", description = "学生姓名属性", example = "jack")private String name;        // 学生姓名@Schema(name = "学生年龄", description = "学生年龄属性", format = "int32", example = "24")private Integer age;        // 学生年龄@Schema(name = "学生地址", description = "学生地址属性", example = "安徽合肥")private String address;     // 学生地址@Schema(name = "学生分数", description = "学生分数属性", format = "double", example = "55.50")private Double fraction;    // 学生分数@Schema(name = "学生爱好", description = "学生爱好属性(List类型)",type = "array", example = "[\"玩\", \"写字\"]")private List<String> likes; // 学生爱好
}

@Paramete

@Parameter 注解用于描述方法参数。如果不希望显示某个参数, 用@Parameter(hidden = true)修饰。

@Parameters({@Parameter(name = "currentPage", description = "当前页码", required = true),@Parameter(name = "size", description = "当前页大小", example = "10"),@Parameter(name = "queryUser", description = "用户查询条件")
})

Controller 接口定义

启动项目,打开链接:http://localhost:8013/swagger-ui/index.html

@RestController
@RequestMapping("/students")
@Tag(name = "StudentControllerAPI", description = "学生控制器接口", externalDocs = @ExternalDocumentation(description = "这是一个接口文档介绍"))
public class StudentController {@Operation(summary = "根据Id查询学生信息", description = "根据ID查询学生信息,并返回响应结果信息",parameters = {@Parameter(name = "id", description = "学生ID", required = true, example = "1")},responses = {@ApiResponse(responseCode = "200",description = "响应成功",content = @Content(mediaType = "application/json",schema = @Schema(title = "Resul和StudentVO组合模型",description = "返回实体,AjaxResult内data为StudentVO模型",anyOf = {Result.class, StudentVO.class}))),@ApiResponse(responseCode = "500",description = "响应失败",content = @Content(mediaType = "application/json",schema = @Schema(title = "Resul模型",description = "返回实体,Result内 data为空",implementation = Result.class)))})@GetMapping("/{id}")public Result<StudentVO> findOneStudent(@PathVariable(value = "id") Long id) {//模拟学生数据List<String> likes = Arrays.asList("抓鱼", "爬山", "写字");StudentVO studentVO = new StudentVO(id, "张三", 22, "惠州", 93.5, likes);return new Result<StudentVO>(200, "成功", studentVO);}@Operation(summary = "查询全部学生数据",description = "查询学生信息,并返回响应结果信息",responses = {@ApiResponse(responseCode = "200",description = "响应成功",content = @Content(mediaType = "application/json",schema = @Schema(title = "AjaxResul和StudentVO组合模型",description = "返回实体,Result内data为StudentVO模型(并且StudentVO为集合)",anyOf = {Result.class, StudentVO.class})))})@GetMapping("/lists")public Result<List<StudentVO>> findAllStudent() {//模拟学生数据List<String> likes = Arrays.asList("抓鱼", "爬山", "写字");StudentVO student1 = new StudentVO(1L, "张三", 22, "深圳", 93.5, likes);StudentVO student2 = new StudentVO(2L, "李四", 24, "惠州", 99.5, likes);return new Result(200, "成功", Arrays.asList(student1, student2));}@Operation(summary = "学生查询接口", description = "学生查询接口")@GetMapping("/query")public Result<List<StudentVO>> queryStudent(QueryStudentDTO queryStudentDTO) {//模拟学生数据List<String> likes = Arrays.asList("抓鱼", "爬山", "写字");StudentVO student1 = new StudentVO(1L, "张三", 22, "广东深圳", 93.5, likes);StudentVO student2 = new StudentVO(2L, "李四", 24, "广东惠州", 99.5, likes);return new Result<List<StudentVO>>(200, "成功", Arrays.asList(student1, student2));}@Operation(summary = "学生添加接口", description = "学生添加接口")@PostMappingpublic Result saveStudent(@RequestBody StudentDTO studentDTO) {System.out.println("成功添加数据:" + studentDTO);return new Result(200, "成功", null);}}

参考资料

  1. Spring Boot 3.x 中使用 SpringDoc 2 / Swagger3(详解)-腾讯云开发者社区-腾讯云
  2. SpringBoot3整合SpringDoc实现在线接口文档 - 程序员晓凡 - 博客园
  3. https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/
  4. https://springdoc.org/#getting-started
  5. https://springdoc.org/#migrating-from-springfox
  6. https://www.cnblogs.com/antLaddie/p/17418078.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91226.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91226.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/91226.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

@RefreshScope 核心原理深度解析:Spring Boot 的动态魔法

让我们通过全新的原理图解和代码级分析&#xff0c;揭开RefreshScope实现配置热更新的神秘面纱&#xff01;一、工作原理全景图&#xff08;优化版&#xff09; #mermaid-svg-50lhLlOFeSRIWnLn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px…

万字详解——OSI七层模型:网络通信的完整架构解析

OSI七层模型&#xff1a;网络通信的完整架构解析OSI&#xff08;Open Systems Interconnection&#xff09;七层模型是计算机网络领域最基础、最权威的参考框架。它由国际标准化组织&#xff08;ISO&#xff09;于1984年提出&#xff0c;旨在为不同厂商、不同技术的网络设备和系…

一个人开发一个App(OpenApi)

为了少写代码&#xff0c;统一前后端的网络层&#xff0c;我使用了OpenApi设计restful接口。然后用openapi-generator来生成flutter的代码。生成go代码用的是oapi-codegen,它对go更友好一些。 我们直接在api.yml中设计接口&#xff0c;所有的返回值与请求者都提取到components里…

光伏气象监测系统:助力光伏发电的智慧大脑

光伏气象监测系统&#xff1a;助力光伏发电的智慧大脑 柏峰【BF-GFQX】在全球积极推动能源转型、大力倡导 “双碳” 目标的当下&#xff0c;光伏发电凭借其清洁、可再生的显著优势&#xff0c;宛如一颗冉冉升起的新星&#xff0c;在能源领域迅速崭露头角&#xff0c;得以广泛推…

SpringCloud01——项目演变、微服务远程调用三种方式、springcloud介绍、nacos注册中心

目录 一、项目架构演变过程 1、单体应用架构 2、垂直应用架构 3、分布式服务架构 4、流动计算架构&#xff08;SOA架构&#xff09; 5、微服务架构 二、如何实现微服务远程调用 1、HttpClient工具类&#xff08;springboot中&#xff09; 形式1&#xff1a;调用第三方…

Oracle 和 MySQL 中的日期类型比较

Oracle 和 MySQL 都提供了多种日期和时间数据类型&#xff0c;但它们在实现和功能上有一些差异。以下是两者的主要日期类型对比&#xff1a;Oracle 日期类型DATE存储日期和时间&#xff08;精确到秒&#xff09;格式&#xff1a;YYYY-MM-DD HH24:MI:SS示例&#xff1a;TO_DATE(…

基于 Redis 实现共享 Session 登录的多种方法与实践

全文目录&#xff1a;开篇语**前言****1. 什么是共享 Session 登录&#xff1f;****2. 基于 Redis 实现共享 Session 的基本方法****2.1 通过 Redis 存储 Session 数据****2.1.1 基本流程****2.1.2 示例代码&#xff08;Java Spring Boot Redis&#xff09;****3. 使用 Redis…

spring cloud + easyRules 零基础搭建智能规则引擎

你是否曾想过在项目中嵌入一套轻量级且高度可扩展的规则引擎&#xff0c;轻松实现动态化的业务决策&#xff1f;在金融、电商、政务等领域&#xff0c;风险控制是业务安全的核心。传统硬编码方式很难应对复杂多变的风控需求&#xff0c;而规则引擎允许我们将这些规则独立出来&a…

AI应用:电路板设计

Diode Computers 公司 Diode Computers是一家专注于利用AI技术进行定制电路板设计和制造的公司&#xff0c;提供从概念到量产的全流程服务。其核心优势在于将电路板设计转化为AI可理解的代码形式&#xff0c;大幅提升设计效率并降低传统EDA工具的使用门槛 0。 核心服务 设计与制…

RocketMQ学习系列之——客户端消息确认机制

一、客户端使用MQ基本代码示例1、添加maven依赖<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>5.3.0</version> </dependency>2、生产者代码示例public class Produc…

[leetcode] 组合总和

39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; i class Solution {int aim;vector<vector<int>> ret;vector<int> path; public:vector<vector<int>> combinationSum(vector<int>& nums, int target) {aim target;dfs(nums…

新能源行业B端极简设计:碳中和目标下的交互轻量化实践

新能源行业B端极简设计&#xff1a;碳中和目标下的交互轻量化实践内容摘要在新能源行业&#xff0c;碳中和目标正推动着企业追求更高的运营效率和更低的资源消耗。然而&#xff0c;传统的B端交互设计往往复杂繁琐&#xff0c;不仅增加了用户的操作成本&#xff0c;还可能导致资…

减速机:自动化生产线的“精密传动心脏”

减速机作为自动化生产线的核心传动部件&#xff0c;通过调节转速与扭矩实现设备精准控制&#xff0c;其在自动化生产线中发挥着关键作用。以下是其具体应用方式&#xff1a;输送线驱动在自动化生产线中&#xff0c;输送线用于运输物料、半成品或成品&#xff0c;通过减速机可以…

从0到1学PHP(五):PHP 数组:高效存储与处理数据

目录一、数组的定义与分类1.1 索引数组1.2 关联数组1.3 多维数组二、数组的基本操作2.1 数组元素的添加、删除、修改和访问2.2 数组指针的操作三、数组处理函数3.1 数组排序函数3.2 数组统计函数3.3 数组过滤与转换函数一、数组的定义与分类 在 PHP 中&#xff0c;数组是一种非…

vscode 字体的跟换

打开vscode 左下角输入电脑中已经有的字体&#xff1a;有想要用的可以自己进行安装刷新这样就可改变了

墨者:SQL过滤字符后手工注入漏洞测试(第3题)

1. 墨者学院&#xff1a;SQL过滤字符后手工注入漏洞测试(第3题)&#x1f680; 因为练习过太多的sql注入&#xff0c;废话不多介绍&#xff0c;我会通过围绕手动注入和工具爆破的方式达到靶场目标&#xff0c;开练&#xff01;&#xff01;&#xff01; 2. 手工注入方式&#x1…

【Spring AI实战】实现仿DeepSeek页面对话机器人(支持多模态上传)

一、前言 二、实现效果 三、代码实现 3.1 后端代码 3.2 前端代码 一、前言 Spring AI详解&#xff1a;【Spring AI详解】开启Java生态的智能应用开发新时代(附不同功能的Spring AI实战项目)-CSDN博客 二、实现效果 可上传图片或音频数据给大模型分析 三、代码实现 3.1 后…

Vue 正在热映模块

Vue 渐进式JavaScript 框架 基于Vue2的移动端项目&#xff1a;正在热映模块 目录 正在热映 数据修改 导入axios 配置反向代理 正在热映渲染 赋值数据 渲染列表 显示图片 优化列表 设置列表样式 主演 定义过滤器 使用过滤器 主演过长处理 无主演情况处理 观众评…

阿里云上进行k8s集群的配置

在阿里云容器服务Kubernetes&#xff08;ACK&#xff09;中配置集群的核心步骤可分为以下六大关键环节&#xff0c;涵盖架构设计到运维管理&#xff1a;1. 集群规划与基础配置 集群类型选择 托管版&#xff1a;Master节点由阿里云托管&#xff08;推荐生产环境&#xff09;专有…

页面性能优化

优化点解决方案效果双向绑定数量过多竞对设置单元格内部涉及双向绑定的输入组件过多&#xff0c;线上页面最多有88个该和抽屉中的编辑表格一样的组件&#xff0c;共计930个&#xff08;按每行最少6个来计算的&#xff09;双向绑定的组件&#xff0c;严重拖累页面性能。数据计算…