Spring Boot 2.x 集成 Knife4j (OpenAPI 3) 完整操作指南

本人在进行Java项目开发时,集成Knife4j 遇到了多方面的问题,在这里进行了一下记录总结。


文章目录

1. 环境准备

1.1 确认 Spring Boot 版本

1.2 确认项目结构

2. 依赖配置

2.1 添加 Knife4j 依赖

2.2 移除旧版本 Swagger 依赖(如有)

3. 配置类设置

3.1 创建 Swagger 配置类

3.2 可选:WebMvc 配置(解决静态资源问题)

4. 应用配置文件

4.1 application.yml 配置

4.2 application.properties 配置(可选)

5. 代码注解使用指南

5.1 控制器层注解

控制器示例:

5.2 DTO/实体类注解

DTO 示例:

5.3 响应对象注解

6. 安全配置(如果使用 JWT 等安全框架)

7. 访问和测试

7.1 文档访问地址

7.2 功能特性

8. 常见问题及解决方案

8.1 页面无法访问

8.2 接口文档不显示

8.3 静态资源加载失败

9. 版本兼容性参考

10. 最佳实践建议


1. 环境准备

1.1 确认 Spring Boot 版本

确保使用 Spring Boot 2.x 版本(推荐 2.5.x - 2.7.x)

1.2 确认项目结构

  • Maven 项目
  • Spring Boot 2.x
  • 需要 API 文档功能

2. 依赖配置

2.1 添加 Knife4j 依赖

在 pom.xml 中添加:

<properties> <!-- 推荐使用 4.1.0 或 4.3.0 --> <knife4j.version>4.3.0</knife4j.version> </properties> <dependencies> <!-- Knife4j OpenAPI3 增强依赖 --> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi3-spring-boot-starter</artifactId> <version>${knife4j.version}</version> </dependency> </dependencies>

2.2 移除旧版本 Swagger 依赖(如有)

确保移除以下旧依赖:

<!-- 需要移除的依赖 --> <!-- <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> </dependency> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> </dependency> -->

注意:只保留Knife4j 依赖,其他的swagger相关依赖不要保留,否则会出现冲突!!!

3. 配置类设置

3.1 创建 Swagger 配置类

package com.example.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.info.Contact; import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; import lombok.extern.slf4j.Slf4j; import javax.annotation.PostConstruct; @Configuration @EnableKnife4j // 启用 Knife4j 增强功能 @Slf4j public class SwaggerConfig { @Bean public OpenAPI customOpenAPI() { log.info("=== 初始化 Knife4j OpenAPI3 配置 ==="); return new OpenAPI() .info(apiInfo()); } private Info apiInfo() { return new Info() .title("项目名称 API 文档") .description("项目描述信息") .termsOfService("http://localhost:8080/") .contact(new Contact() .name("开发团队") .url("http://localhost:8080/") .email("[email protected]")) .version("1.0"); } @PostConstruct public void init() { log.info("=== Knife4j OpenAPI3 配置初始化完成 ==="); log.info("文档地址: http://localhost:8080/doc.html"); log.info("OpenAPI JSON: http://localhost:8080/v3/api-docs"); } }

3.2 可选:WebMvc 配置(解决静态资源问题)

package com.example.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 确保 Knife4j 的静态资源能够正常访问 registry.addResourceHandler("doc.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); } }

若访问文档地址: http://localhost:8080/doc.html遇到Knife4j文档请求异常的错误提示(如下图),可以添加WebMvc 配置来进行解决,我出现这个错误就是添加WebMvc 配置解决的

4. 应用配置文件

4.1 application.yml 配置

# Spring 配置 spring: mvc: pathmatch: matching-strategy: ant_path_matcher # Spring Boot 2.6+ 必须配置 # Knife4j 配置 knife4j: enable: true setting: language: zh-CN # 中文界面

4.2 application.properties 配置(可选)

# Spring 配置 spring.mvc.pathmatch.matching-strategy=ant_path_matcher # Knife4j 配置 knife4j.enable=true knife4j.setting.language=zh-CN

5. 代码注解使用指南

5.1 控制器层注解

新版 OpenAPI3 注解

OpenAPI3 注解说明
@Tag控制器分类
@Operation接口操作
@Parameter参数说明
@ApiResponse响应说明

控制器示例:
@RestController @RequestMapping("/api/user") @Tag(name = "用户管理", description = "用户注册、登录、信息管理等接口") public class UserController { @PostMapping("/login") @Operation(summary = "用户登录", description = "通过用户名和密码登录系统") public Result<LoginVO> login( @Parameter(description = "登录参数", required = true) @Valid @RequestBody LoginDTO loginDTO) { // 业务逻辑 } }

5.2 DTO/实体类注解

 新版 OpenAPI3 注解

OpenAPI3 注解说明
@Schema模型说明
@Schema属性说明
DTO 示例:
@Data @Schema(description = "用户登录请求参数") public class LoginDTO { @Schema(description = "用户名", example = "admin", required = true) @NotBlank(message = "用户名不能为空") private String username; @Schema(description = "密码", example = "123456", required = true) @NotBlank(message = "密码不能为空") private String password; }

5.3 响应对象注解

@Data @Schema(description = "通用返回结果") public class Result<T> { @Schema(description = "状态码", example = "200") private Integer code; @Schema(description = "提示信息", example = "成功") private String msg; @Schema(description = "返回数据") private T data; }

6. 安全配置(如果使用 JWT 等安全框架)

在安全过滤器中放行 Knife4j 相关路径:

// 在 JWT 过滤器或安全配置中 private boolean isPublicUri(String uri) { return uri.startsWith("/doc.html") || uri.startsWith("/webjars/") || uri.startsWith("/v3/api-docs") || uri.startsWith("/favicon.ico") || uri.equals("/") || uri.startsWith("/swagger-resources"); }

7. 访问和测试

7.1 文档访问地址

7.2 功能特性

  •  接口分组管理
  •  在线调试
  •  接口搜索
  •  离线文档导出
  •  全局参数设置
  •  接口权限控制

8. 常见问题及解决方案

8.1 页面无法访问

  1. 检查依赖版本:确认 Knife4j 版本兼容性
  2. 检查配置:确认 @EnableKnife4j 注解已添加
  3. 清除缓存:浏览器 Ctrl+F5 强制刷新

8.2 接口文档不显示

  1. 检查注解:确认使用了正确的 OpenAPI3 注解
  2. 检查包扫描:确认控制器在 Spring 扫描路径内
  3. 检查安全配置:确认 Knife4j 路径已放行

8.3 静态资源加载失败

  1. 添加 WebMvc 配置:配置静态资源处理器
  2. 检查路径匹配策略:确认 ant_path_matcher 配置

9. 版本兼容性参考

Spring Boot 版本推荐 Knife4j 版本说明
2.5.x4.1.0 - 4.3.0稳定兼容
2.6.x4.1.0 - 4.3.0需配置 pathmatch
2.7.x4.3.0最新稳定

10. 最佳实践建议

  1. 统一响应格式:所有接口使用统一的 Result 包装类
  2. 详细接口描述:为每个接口和参数添加清晰的描述
  3. 分组管理:按模块对接口进行分组
  4. 版本控制:在 API 路径中包含版本号
  5. 权限控制:在文档中明确接口的访问权限要求

Read more

【数据结构】栈和队列的定义与实现

【数据结构】栈和队列的定义与实现

主页:HABUO🍁主页:HABUO 🍁如果再也不能见到你,祝你早安,午安,晚安🍁 1.栈 1.1 栈的定义及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作叫做出栈。出数据也在栈顶。 如下图所示: 总结:其实栈就是一个后进先出的一个容器,注意可以边进边出,什么意思呢?例如上述图,a1进栈之后可以出栈之后a2再进栈,因此一个入栈序列可以对应多个出栈序列。  1.2 栈的实现 分析:我们前面学过了顺序表也即是可以动态增容的数组,也学过了链表,无论是带头不带头、循环不循环、双向不双向,我们是不是都搞定了。

By Ne0inhk
【数据结构-初阶】详解线性表(5)---队列

【数据结构-初阶】详解线性表(5)---队列

🎈主页传送门:良木生香 🔥个人专栏:《C语言》 《数据结构-初阶》 《程序设计》 🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离 上期回顾:在上一篇文章(【数据结构-初阶】详解栈和队列(1)---栈)中我们讲到了在顺序表与链表之外的另一种线性表---栈,知道了这是一种具有先进后出和后进先出特点的数据结构,既然有先进后出,那么肯定就有先进先出的数据结构,所以这就是我们今天要讲的------队列 一、队列的概念 既然我们想要实现先进先出的效果,那肯定就不像栈那样有一端是堵起来的,想必应该是两端都开口吧。嗯,事实确实如此。 队列:是只允许在一端进行数据的插入操作,在另一端进行数据的删除操作的一种特殊的线性表,其具有先进先出FIFO(first in first out)的结构特点. 入队列:进行插入操作的一端叫做队尾 出队列:进行删除操作的一端叫做队头 下面是队列的示意图: 名字叫做队列,其实就像我们排队一样,先排的人先得服务,后排的人后得到服务,在队列中,先进来的元素先得到操作,

By Ne0inhk
【递归、搜索与回溯算法必刷42题:专题一】从汉诺塔问题到快速幂

【递归、搜索与回溯算法必刷42题:专题一】从汉诺塔问题到快速幂

🎬 个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬 艾莉丝的简介: 🎬艾莉丝的算法专栏简介: 文章目录 * 本文设计专题一算法题链接 * 1 汉诺塔问题 * 题目描述 * 汉诺塔问题(递归解法) * 1. 问题描述 * 2. 递归思想 * 基本情况(递归终止条件) * 递归分解(n ≥ 2) * 3. 递归算法流程(函数设计) * 函数头 * 递归函数流程: * 解题过程 * 算法实现(C++) * 2 合并两个有序链表 * 题目描述 * 解题过程 * 算法实现(

By Ne0inhk

人脸识别核心算法深度解析:FaceNet与ArcFace从原理到实战

本文深入剖析人脸识别领域两大里程碑算法——Google的FaceNet和InsightFace的ArcFace,从数学原理、损失函数设计到完整PyTorch实现,帮你彻底理解现代人脸识别技术的核心。 一、引言:人脸识别的本质问题 1.1 人脸识别 ≠ 图像分类 初学者常有的误解:把人脸识别当作分类问题。 ❌ 错误思路:分类方法 输入人脸 → CNN → Softmax → 输出"这是第1532号人" 问题: 1. 类别数巨大(十亿级身份) 2. 无法处理新注册的人(需要重新训练) 3. 每个人样本极少(很难训练好分类器) ✅ 正确思路:度量学习方法 输入人脸 → CNN → 特征向量(embedding) → 与数据库比对 优势: 1. 只需学习"什么是相似",不需要预定义类别 2. 新人注册只需提取特征,无需重新训练

By Ne0inhk