Spring Boot3整合Knife4j(4.5.0)
整体概述
Spring Boot 是用于简化 Spring 应用开发的框架,通过自动配置和约定大于配置原则,能让开发者快速搭建和运行 Spring 应用。Knife4j 是基于 Swagger 增强的 API 文档生成工具,可方便展示和调试 API 接口,生成美观易用的 API 文档。以下将详细介绍如何从零开始把 Spring Boot 3.3.0 与 Knife4j 4.5.0 进行整合。
步骤 1:创建 Spring Boot 项目
方式一:使用 Spring Initializr
Spring Initializr 是在线的 Spring Boot 项目生成器,提供图形化界面,便于快速创建项目。
- 打开浏览器,访问 Spring Initializr。
- 在页面做如下配置:
- Project:选
Maven Project,Maven 是项目管理和构建工具,可管理项目依赖、编译、打包等操作。 - Language:选
Java,使用 Java 语言开发。 - Spring Boot:选
3.3.0,即要使用的 Spring Boot 版本。 - Group:通常是公司或组织域名倒序,如
com.example,用于唯一标识项目所属组织或团队。 - Artifact:是项目名称,如
spring - boot - knife4j - demo,是项目在 Maven 仓库的唯一标识符。 - Dependencies:点击
Add Dependencies按钮,搜索并添加Spring Web依赖,Spring Web用于开发 Web 应用,包含 Spring MVC 等核心组件。
- Project:选
- 配置完成后,点击
Generate按钮,浏览器会下载项目压缩包。 - 解压下载的压缩包,用喜欢的集成开发环境(IDE)打开项目。以 IntelliJ IDEA 为例,打开 IDE,选
File->Open,再选解压后的项目文件夹。
方式二:使用 IDE 自带的 Spring Initializr
若使用 IntelliJ IDEA,也可通过其自带的 Spring Initializr 创建项目:
- 打开 IntelliJ IDEA,选
File->New->Project。 - 在左侧面板选
Spring Initializr,按上述步骤 2 配置。 - 点击
Next,选项目存储位置,再点击Finish完成项目创建。
步骤 2:添加 Knife4j 依赖
在项目的 pom.xml 文件中添加 Knife4j 依赖。pom.xml 是 Maven 项目配置文件,用于管理项目依赖和构建信息。打开 pom.xml 文件,在 <dependencies> 标签内添加以下代码:
<dependencies><!-- Spring Web 依赖,用于开发 Web 应用 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Knife4j 依赖,用于生成和展示 API 文档 --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.5.0</version></dependency>
</dependencies>
添加依赖后,Maven 会自动从中央仓库下载所需库文件。在 IntelliJ IDEA 中,IDE 会自动检测 pom.xml 文件变化,并提示导入依赖,点击 Import Changes 按钮,等待依赖下载完成。
步骤 3: Knife4j 界面自定义配置
package org.example.test1;import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class Knife4jConfig {@Beanpublic GroupedOpenApi api4() {return GroupedOpenApi.builder().group("all").displayName("所有接口").packagesToScan("org.example.test1")// 自定义全局响应码
// .addOpenApiCustomizer((this::setCustomStatusCode)).build();}
}
步骤 4:创建实体类
实体类用于表示业务数据,使用 Swagger 注解为实体类和其属性添加描述信息,以便在 API 文档中清晰展示。
@Schema 注解用于为实体类添加描述信息,name 为实体类在文档中的名称,description 为详细描述
@Schema 注解为属性添加描述信息,description 为属性描述,example 为示例值
import io.swagger.v3.oas.annotations.media.Schema;// @Schema 注解用于为实体类添加描述信息,name 为实体类在文档中的名称,description 为详细描述
@Schema(name = "User", description = "用户实体类")
public class User {// @Schema 注解为属性添加描述信息,description 为属性描述,example 为示例值@Schema(description = "用户 ID", example = "1")private Long id;@Schema(description = "用户名", example = "张三")private String username;@Schema(description = "用户邮箱", example = "666@example.com")private String email;// 构造函数、Getter 和 Setter 方法public User() {}public User(Long id, String username, String email) {this.id = id;this.username = username;this.email = email;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}
}
步骤 5:创建 Controller
Controller 负责处理客户端请求并返回响应。使用更多 Swagger 注解描述接口的请求参数、响应结果等信息。
// @Tag 用于对 API 接口进行分组和描述,name 为分组名称,description 为分组详细描述
// @Operation 描述接口的操作信息,summary 为摘要,description 为详细描述
// @ApiResponses 定义接口的响应状态码和对应的响应信息
import io.swagger.v3.oas.annotations.Operation; // 导入Swagger Operation注解,用于描述API操作
import io.swagger.v3.oas.annotations.Parameter; // 导入Swagger Parameter注解,用于描述API参数
import io.swagger.v3.oas.annotations.media.Content; // 导入Swagger Content注解,用于定义API响应内容类型
import io.swagger.v3.oas.annotations.media.Schema; // 导入Swagger Schema注解,用于定义API响应模式
import io.swagger.v3.oas.annotations.responses.ApiResponse; // 导入Swagger ApiResponse注解,用于定义API响应信息
import io.swagger.v3.oas.annotations.responses.ApiResponses; // 导入Swagger ApiResponses注解,用于定义多个API响应信息
import io.swagger.v3.oas.annotations.tags.Tag; // 导入Swagger Tag注解,用于对API进行分组和描述
import org.springframework.web.bind.annotation.*; // 导入Spring MVC注解,用于处理HTTP请求import java.util.ArrayList; // 导入ArrayList类,用于动态数组操作
import java.util.List; // 导入List接口// @RestController 是 @Controller 和 @ResponseBody 的组合注解,标识该类是RESTful风格的控制器
@RestController
// @RequestMapping 用于映射请求的URL前缀
@RequestMapping("/api/users")
// @Tag 用于对API接口进行分组和描述,name 为分组名称,description 为分组详细描述
@Tag(name = "用户管理接口", description = "提供用户相关的操作接口")
public class UserController {private List<User> users = new ArrayList<>(); // 创建一个List集合用于存储用户数据// @Operation 描述接口的操作信息,summary 为摘要,description 为详细描述@Operation(summary = "获取所有用户", description = "返回所有用户的列表")// @ApiResponses 定义接口的响应状态码和对应的响应信息@ApiResponses(value = {// @ApiResponse 具体描述某个响应状态码的信息,responseCode 为响应状态码,description 为描述,content 为响应内容@ApiResponse(responseCode = "200", description = "成功获取用户列表",content = {@Content(mediaType = "application/json",// @Schema 指定响应内容的数据结构schema = @Schema(implementation = User.class))}})})@GetMappingpublic List<User> getUsers() { // 定义一个GET请求处理方法,返回用户列表return users; // 返回用户列表}@Operation(summary = "根据 ID 获取用户", description = "根据用户 ID 获取单个用户信息")@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "成功获取用户信息",content = {@Content(mediaType = "application/json",schema = @Schema(implementation = User.class))}),@ApiResponse(responseCode = "404", description = "未找到该用户", content = @Content)})// @Parameter 描述接口的请求参数,description 为参数描述,example 为示例值@GetMapping("/{id}")public User getUserById(@Parameter(description = "用户 ID", example = "1") @PathVariable Long id) { // 定义一个GET请求处理方法,根据ID获取用户信息return users.stream() // 将用户列表转换为流.filter(user -> user.getId().equals(id)) // 过滤出ID匹配的用户.findFirst() // 查找第一个匹配的用户.orElse(null); // 如果没有找到,返回null}@Operation(summary = "创建用户", description = "创建一个新的用户")@ApiResponses(value = {@ApiResponse(responseCode = "201", description = "用户创建成功",content = {@Content(mediaType = "application/json",schema = @Schema(implementation = User.class))}})@PostMappingpublic User createUser(@Parameter(description = "用户信息", required = true) @RequestBody User user) { // 定义一个POST请求处理方法,创建新用户users.add(user); // 将新用户添加到列表return user; // 返回创建的用户}@Operation(summary = "获取所有用户2", description = "返回所有用户的列表")@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "成功获取用户列表",content = {@Content(mediaType = "application/json",schema = @Schema(implementation = User.class))}})@GetMappingpublic List<User> getUsers2(@Parameter(name = "X-Token", description = "自定义请求头 token", in = ParameterIn.HEADER) @RequestHeader(required = false) String token) { // 定义一个GET请求处理方法,返回用户列表,支持自定义请求头参数return users; // 返回用户列表}}
步骤 6:启动 Spring Boot 应用
在 IDE 中找到项目的启动类(通常是包含 main 方法且带有 @SpringBootApplication 注解的类),右键点击并选择 Run 启动 Spring Boot 应用。启动成功后,控制台会输出启动信息,表明应用已在默认端口(通常是 8080)启动。
步骤 7:访问 Knife4j 文档页面
打开浏览器,访问以下 URL 查看 Knife4j 生成的 API 文档:http://localhost:8080/doc.html
在Springboot的yml文件中配置Knife4j
# Knife4j配置
# springdoc-openapi配置
springdoc:# get请求多参数时不需要添加额外的@ParameterObject和@Parameter注解default-flat-param-object: true# 启用swaggerUIswagger-ui:#自定义swagger前端请求路径,输入http:127.0.0.1:8080/swagger-ui.html会自动重定向到swagger页面path: /swagger-ui.htmlenabled: true# tags-sorter: alpha # 标签的排序方式 alpha:按照子母顺序排序(@ApiSupport注解排序不生效,因此需要设置)# operations-sorter: alpha # 接口的排序方式 alpha:按照子母顺序排序(@ApiOperationSupport注解排序生效,因此这里不作设置)operations-sorter: order # 设置规则为order,该规则会使用Knife4j的增强排序扩展规则`x-order`# 启用文档,默认开启api-docs:path: /v3/api-docs #swagger后端请求地址enabled: true
# knife4j相关配置 可以不用改
knife4j:enable: true #开启knife4j,无需添加@EnableKnife4j注解setting:language: ZH_CN # 中文:ZH_CN 英文:ENenable-swagger-models: trueenable-dynamic-parameter: falsefooter-custom-content: "<strong>Copyright ©️ 2024 Keyidea. All Rights Reversed</strong>"enable-footer-custom: trueenable-footer: trueenable-document-manage: truedocuments: #文档补充说明- name: MarkDown语法说明locations: classpath:static/markdown/grammar/*group: 01-系统接口 # 此处分组必须使用在Knife4jConfig已存在的分组名group,当存在displayName时,使用displayName名称- name: 补充文档locations: classpath:static/markdown/others/*group: 01-系统接口 # 此处分组必须使用在Knife4jConfig已存在的分组名group,当存在displayName时,使用displayName名称
相关文章:
Spring Boot3整合Knife4j(4.5.0)
整体概述 Spring Boot 是用于简化 Spring 应用开发的框架,通过自动配置和约定大于配置原则,能让开发者快速搭建和运行 Spring 应用。Knife4j 是基于 Swagger 增强的 API 文档生成工具,可方便展示和调试 API 接口,生成美观易用的 …...
Scala编程_实现Rational的基本操作
在Scala中实现一个简单的有理数(Rational)类,并对其进行加法、比较等基本操作. 有理数的定义 有理数是可以表示为两个整数的比值的数,通常形式为 n / d,其中 n 是分子,d 是分母。为了确保我们的有理数始终…...
Elasticsearch-07-Elasticsearch Java API Client-Elasticsearch 8.0 的高阶api
文章目录 es8 API基础配置和bean注入高阶使用1:引入elasticsearchClient2:查询所有索引3:查询某个索引4:创建索引5:删除指定索引6:查询索引的映射7:创建索引指定映射8:创建文档使用HashMap作为数据存储容器使用自定义类作为数据存储容器使用外…...
用python和Pygame库实现“跳过障碍”游戏
用python和Pygame库实现“跳过障碍”游戏 游戏开发 跳过障碍游戏流程说明: 启动游戏后显示开始界面(包含游戏说明) 按空格键进入游戏 游戏过程中躲避障碍物获取分数 碰撞后显示结束界面(包含最终得分) 按空格键…...
C/C++中对字符处理的常用函数
C语言中的 ctype.h 头文件提供了一系列字符分类和转换函数,用于高效处理字符相关操作。这些函数通过接受 int 类型参数(需为 unsigned char 或 EOF (-1)值),返回非零值表示条件正确,返回0表示错…...
SqlServer数据库报错紧急或可疑无法访问的修复过程,亲测有效。
当 SQL Server 数据库被标记为 SUSPECT 状态时,表示数据库可能由于事务日志损坏、数据文件丢失或其他严重问题而无法正常启动。以下是一个详细的恢复步骤,基于搜索结果中的信息和常见的最佳实践: 恢复步骤 1. 确认数据库状态 将database-n…...
vue3实现虚拟滚动Vue-Virtual-Scroller
前端优化不可不避的一谈之虚拟滚动:众所周知,滚动是直挺挺的往dom树加东西,如果滚太多滚到万级,渲染过多就会卡顿,而vue-virtual-scroll的灵活懒渲染就能解决这个问题 1,下载与配置 npm install --save v…...
DAY33 贪心算法Ⅱ
122. 买卖股票的最佳时机 II - 力扣(LeetCode) 想到把整体利润分解为每天的利润,就豁然开朗了。 class Solution { public:int maxProfit(vector<int>& prices) {int result0;for(int i1;i<prices.size();i){resultmax(0,pric…...
C#核心笔记——(五)框架概述
.NET Ftamework中几乎所有功能都是通过大量的托管类型提供的。这些类型组织在层次化的命名空间中,并打包为一套程序集,与CLR一起构成了.NET平台。 有些.NET类型是由CLR直接使用的,且对于托管宿主环境而言是必不可少的。这些类型位于一个名为…...
HttpMediaTypeNotAcceptableException报错解决,状态码显示为406
当返回类没有添加 getter 和 setter 方法时出现 HTTP 406 错误(Not Acceptable),主要与 Spring 框架处理响应数据的机制以及消息转换器的工作原理有关 (注意前提,你已经添加了json相关库的依赖) 消息转换器…...
网络DNS怎么更改?
访问速度慢或某些网站无法打开?改变网络DNS设置可能会帮助解决这些问题。本文将详细介绍如何更改网络DNS,包括更改的原因、具体步骤。 一、为什么要更改DNS? 更改DNS的原因有很多,以下是一些主要的考虑因素:某些公共DNS服务器的响应速度比…...
【python-uiautomator2】手机上的ATX应用界面报错问题处理:无法提供服务,非am instrument启动
目录 一、前期准备 1.1 插入设备 1.2 安装atx-agent 二、解决报错:无法提供服务,非am instrument启动 2.1 出现报错 2.2 尝试解决 2.3 最终解决 三、开启ATX的悬浮窗权限 一、前期准备 1.1 插入设备 本地插入待执行设备,待执行设备…...
子母钟系统,京准电子科技助力高考精准计时
子母钟系统,京准电子科技助力高考精准计时 子母钟系统,京准电子科技助力高考精准计时 【摘要】子母钟系统又叫网络时钟系统是校园网络中一个重要的精准计时系统,随着网络的普及,许多校园都建了自己的校园专网,使用的…...
大模型中的剪枝、蒸馏是什么意思?
环境: 剪枝 蒸馏 问题描述: 大模型中的剪枝、蒸馏是什么意思? 解决方案: 大模型的剪枝(Pruning)和蒸馏(Distillation)是两种常见的模型优化技术,用于减少模型的大小…...
深度解析:主流大模型与智能体框架能力对比及实战指南
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。https://www.captainbed.cn/north 文章目录 一、技术演进全景图二、主流大模型能力矩阵1. 闭源模型对比2. 开源模型对比 三、智能体框架深…...
Linux中的基本指令(下)
目录 mv指令 more指令 less指令 head指令 tail 指令 继续理解文件 重定向和追加重定向操作 理解管道 find指令 whereis 指令 bc指令 uname ‒r指令 grep 指令 关机 扩展命令 zip/unzip 指令 tar指令 关于rzsz 系统间的文件互传 接上! mv指令 m…...
关于矢量数据集图表
ui.Chart.feature.byFeature 函数 ui.Chart.feature.byFeature 是 Google Earth Engine (GEE) 中的一个函数,用于创建图表以可视化 FeatureCollection 中各个特征(features)的属性。它通常生成一个分组柱状图,其中: …...
第十七:go 反射
fmt.printf("%T",obj) // 打印 reflect 的类型 fmt.Printf("%T", obj) // *reflect.rtype //打印的是一个指针类型 reflect包 在Go语言中反射的相关功能由内置的reflect包提供,任意接口值在反射中都可以理解为由reflect.Type和…...
3-002: MySQL 中使用索引一定有效吗?如何排查索引效果?
1. 索引失效的常见原因 虽然索引可以加速查询,但在某些情况下,MySQL 可能不会使用索引,甚至使用索引反而更慢。 以下是一些常见导致索引失效的原因: ① 查询条件使用了 ! 或 <> 原因:索引通常用于范围或等值查…...
【RabbitMQ】Spring Boot 结合 RabbitMQ 完成应用间的通信
🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 Spring 框架与 RabbitMQ 的整合主要通过 Spring AMQP(Advanced Message Queuing Protocol)模块实现,提供了便捷的消息队列开发能力。 引…...
Pytorch系列教程:可视化Pytorch模型训练过程
深度学习和理解训练过程中的学习和进步机制对于优化性能、诊断欠拟合或过拟合等问题至关重要。将训练过程可视化的过程为学习的动态提供了有价值的见解,使我们能够做出合理的决策。训练进度必须可视化的两种方法是:使用Matplotlib和Tensor Board。在本文…...
electron+vue+webview内嵌网页并注入js
vue内嵌网页可以使用iframe实现内嵌网页,但是只能通过postMessage间接通信,在electron环境下,vue可以直接使用webview来内嵌网页,支持 executeJavaScript、postMessage、send 等丰富的通信机制。 使用 webview的优势 性能更佳&…...
利用OpenResty拦截SQL注入
需求 客户的一个老项目被相关部门检测不安全,报告为sql注入。不想改代码,改项目,所以想到利用nginx去做一些数据校验拦截。也就是前端传一些用于sql注入的非法字符或者数据库的关键字这些,都给拦截掉,从而实现拦截sql…...
CAD文件转换为STL
AutoCAD与STL格式简介 AutoCAD软件是由美国欧特克有限公司(Autodesk)出品的一款自动计算机辅助设计软件,可以用于绘制二维制图和基本三维设计,通过它无需懂得编程,即可自动制图,因此它在全球广泛使用&…...
78_Pandasagg()和aggregate()的用法
78_Pandasagg()和aggregate()的用法 通过使用pandas.DataFrame和Series的agg()或aggregate()方法,可以对行或列同时应用多个操作进行聚合。agg()是aggregate()的别名,二者用法相同。 pandas.DataFrame.agg — pandas 2.1.3 文档 pandas.Series.agg —…...
QT:串口上位机
创建工程 布局UI界面 设置名称 设置数据 设置波特率 波特率默认9600 设置数据位 数据位默认8 设置停止位 设置校验位 调整串口设置、接收设置、发送设置为Group Box 修改配置 QT core gui serialport 代码详解 mianwindow.h 首先在mianwindow.h当中定义一个串口指…...
C++跨平台开发环境搭建全指南:工具链选型与性能优化实战
C跨平台开发环境搭建全指南:工具链选型与性能优化实战 目录 开发环境搭建工具链选型性能优化实战常见问题排查 开发环境搭建 操作系统环境准备 Windows# 安装Visual Studio Build Tools choco install visualstudio2022buildtools choco install cmake --instal…...
数据批处理(队列方式)
数据批处理(队列方式) public class DataProcessor {private static final int THREAD_COUNT 4;private static final int QUEUE_SIZE 10;private LinkedBlockingQueue<Data> queue new LinkedBlockingQueue<>(QUEUE_SIZE);public DataP…...
win32汇编环境,网络编程入门之二
;运行效果 ;win32汇编环境,网络编程入门之二 ;本教程在前一教程的基础上,研究一下如何得到服务器的返回的信息 ;正常的逻辑是连接上了,然后我发送什么,它返回什么,但是这有一个很尴尬的问题。 ;就是如何表现出来。因为网络可能有延…...
MATLAB—从入门到精通的第二天
在第一天的学习中,我们掌握了 MATLAB 的安装配置、基础语法、变量管理和运算符的使用。本文将深入讲解 控制结构(嵌套 if、switch)、循环类型 和 向量操作,帮助读者进一步掌握 MATLAB 的核心编程技能。 1. 条件语句进阶 1.1 嵌套…...
