避坑指南:还在用 springfox?快换成这位“天选之子”吧!
各位小伙伴,有没有遇到过这种让人抓狂的场面:兴冲冲地把 spring boot 2 升级到 spring boot 3,一启动,嘿,项目跑起来了!正准备给自己点个赞,结果一打开 swagger 页面——404 空白。
这时候你才恍然大悟:原来当年陪我们渡过了无数个 crud 日夜的 springfox,早在 2020 年就悄悄停更了。它不仅跟不上 openapi 3 的新潮规范,更致命的是,它底层死死抱住的 javax.* 包,在 spring boot 3 时代已经被彻底连根拔起,换成了 jakarta.* 。
简单来说,这不是你代码写得有问题,而是时代的眼泪。面对这种“版本刺客”,硬刚肯定是不现实的。既然官宣分手,咱们就得收拾心情,寻找新的幸福——也就是今天的主角:springdoc。而 knife4j 的底层就是springdoc。
为什么我说它是“天选之子”?
• 无缝衔接:它是基于 openapi 3 规范量身定制的,对 spring boot 3 甚至 webflux 都是原生级支持,丝滑得就像德芙。
• 极简主义:以前用 springfox 时,那一堆繁琐的 docket 配置是不是让你很头疼?换成 springdoc 后,很多时候你只需要引入一个 starter 依赖,连配置文件都不用写就能直接起飞。
• 社区活跃:不像前任那样玩失踪,springdoc 社区更新非常活跃,遇到 bug 也有人管,这才是长长久久的靠谱之选。
一、 核心组件与关系介绍
在微服务架构中,api 文档工具通常分为“规范”、“生成器”和“展示层”三个部分。以下是它们的具体分工与关系:
组件 | 角色定位 | 核心作用 | 与 knife4j 的关系 |
swagger (openapi 3) | 接口规范 | 定义了一套用于描述 api 接口的标准(如路径、参数、返回值)。 | knife4j 完全遵循 openapi 3.0 规范生成文档。 |
springdoc | 规范实现 | 扫描 spring boot 代码中的注解 (如 @tag, @operation) ,自动生成符合 openapi 规范的 json 数据。 springdoc 自带原生 swagger ui。 | 底层依赖。knife4j 4.x 已内置 springdoc,负责数据的生产。 |
knife4j | ui 增强层 | 基于 springdoc 提供的数据,渲染出美观、交互性更强的文档界面。 | 上层封装。在 springdoc 基础上提供了文档增强、离线导出等功能。 |
二、 knife4j 简介与资源
knife4j 是一个为 java mvc 框架集成 swagger 生成 api 文档的增强解决方案。其前身是 swagger-bootstrap-ui,旨在提供更符合国人习惯的接口文档体验。
- 核心作用:
- 文档说明:根据代码注解自动生成详尽的接口文档,包含请求/响应示例。
- 在线调试:提供强大的接口调试功能,支持全局参数、动态参数修改。
- 离线文档:支持导出 markdown、html、word 等格式的离线文档,方便交付。
- 界面优化:提供现代化的 ui 界面,支持深色模式、接口搜索与排序。
- 官方资源:

三、 spring boot 3.5 单体应用集成步骤
1. 环境准备
- jdk:17 及以上(spring boot 3.x 强制要求)
- spring boot:3.5.9
- knife4j:4.3.0
2. 引入 maven 依赖
在 pom.xml 中添加 knife4j 的 starter。该依赖已内置 springdoc,无需再单独引入 swagger 相关包。
<dependency>
<groupid>com.github.xiaoymin</groupid>
<artifactid>knife4j-openapi3-jakarta-spring-boot-starter</artifactid>
<version>4.3.0</version>
</dependency>依赖包 knife4j-openapi3-jakarta-spring-boot-starter 包含子依赖包主要有:
依赖包 | 描述 | 核心作用 |
knife4j-openapi3-ui | knife4j 的 ui 核心 | 提供增强的 web 界面 (/doc.html),包含文档渲染、接口调试、全局参数、离线导出等功能。 |
knife4j-core | knife4j 工具模块 | 提供工具类、模型定义、核心工具链等底层支持。 |
springdoc-openapi-starter-webmvc-ui | springdoc webmvc 集成与 ui | 提供原生的 swagger ui (/swagger-ui.html),是 springdoc 自动配置的入口。 |
springdoc-openapi-starter-webmvc-api | springdoc webmvc api 支持 | 提供对 spring webmvc 的底层支持,包含请求/响应处理、参数解析等。 |
springdoc-openapi-starter-webmvc-common | springdoc webmvc 通用模块 | 包含 springdoc 的通用工具类和核心逻辑,是 api 模块的基础。 |
swagger-annotations-jakarta | openapi 注解库 (jakarta) | 提供 jakarta命名空间版本的 openapi 注解,如 @tag, @operation, @schema等。 |
swagger-models-jakarta | openapi 模型库 (jakarta) | 提供 jakarta命名空间版本的 openapi 数据模型,如 info, contact, openapi等。 |
swagger-ui | swagger ui 前端资源 | 包含 swagger ui 的所有前端静态资源(html, js, css),被 springdoc-openapi-starter-webmvc-ui所依赖。 |
3. 配置文件 (application.yml)
配置 springdoc 的扫描规则和 knife4j 的增强特性。
# springdoc 原生配置
springdoc:
swagger-ui:
enabled: true
path: /swagger-ui.html
tags-sorter: alpha
operations-sorter: alpha
api-docs:
enabled: true
path: /v3/api-docs
group-configs:
- group: default
paths-to-match: '/**'
packages-to-scan: com.example.controller
# knife4j 增强配置
knife4j:
enable: true
setting:
language: zh_cn
enable-swagger-models: true
swagger-model-name: 实体类列表4. 初始化配置 @configuration
/**
* openapi3在线接口文档组件初始化
*/
@slf4j
@configuration(proxybeanmethods = false)
@conditionalonproperty(name = "springdoc.api-docs.enabled", matchifmissing = true)
public class openapi3config {
@bean
public openapi springdocopenapi() {
return new openapi(specversion.v30).info(new info()
.title("api文档")
.description("简介")
.version("v1.0"))
// 配置authorizations
.components(new components()
.addsecurityschemes("authorization", new securityscheme().name("authorization").in(securityscheme.in.header).type(securityscheme.type.apikey))
.addsecurityschemes("tenandid", new securityscheme().name("tenandid").in(securityscheme.in.header).type(securityscheme.type.apikey)));
}
}5. 注解示例
spring boot 3.x 使用 openapi 3 规范注解,与旧版 swagger 2 不同。
注解 | 作用位置 | 描述 | 示例/替代旧注解 |
@tag | controller 类 | api 分组标签 | 替代 @api |
@operation | controller 方法 | 单个接口的详细描述 | 替代 @apioperation |
@parameter | 方法参数 | 描述单个参数 | 替代 @apiparam |
@schema | 模型类/字段 | 描述数据模型/字段 | 替代 @apimodel, @apimodelproperty |
@parameters | 方法 | 多个参数的容器 | 包含多个 @parameter |
控制器controller
import io.swagger.v3.oas.annotations.operation;
import io.swagger.v3.oas.annotations.parameter;
import io.swagger.v3.oas.annotations.tags.tag;
@restcontroller
@requestmapping("/api/users")
@tag(name = "用户管理")
public class usercontroller {
@getmapping("/{id}")
@operation(summary = "根据id查询用户")
public string getuser(@parameter(description = "用户id", required = true) @pathvariable long id) {
return "user " + id;
}
}实体bean
@schema(description = "用户信息")
@data
@builder
@noargsconstructor
@allargsconstructor
public class userinfo {
/**
* 中文名
*/
@schema(description = "中文名")
private string name;
}6 访问验证
启动项目后,访问以下地址:
- knife4j 文档地址:http://localhost:8080/doc.html
- 原生 swagger 地址:http://localhost:8080/swagger-ui.html
效果图

四、 spring cloud gateway 集成方案
在微服务架构中,通常希望在网关层聚合所有微服务的接口文档,无需逐个访问子服务。
1. 网关服务 (gateway) 配置
在 gateway 模块中引入聚合依赖:
<dependency>
<groupid>com.github.xiaoymin</groupid>
<artifactid>knife4j-gateway-spring-boot-starter</artifactid>
<version>4.3.0</version>
</dependency>
<!-- 这里特别注意,只能引入 springdoc-openapi-starter-webflux-api ,
不要引入 springdoc-openapi-starter-webflux-ui,
不然在 doc.html 会出现微服务下拉列表无法获取数据 -->
<dependency>
<groupid>org.springdoc</groupid>
<artifactid>springdoc-openapi-starter-webflux-api</artifactid>
<version>2.8.15</version>
</dependency>
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-gateway-server-webflux</artifactid>
<version>4.3.3</version>
</dependency>在 application.yml 中开启服务发现模式聚合:
# 第二种配置方式:自动发现
knife4j:
gateway:
enabled: true
# 指定聚合模式为服务发现(基于注册中心如 nacos/eureka)
strategy: discover
discover:
enabled: true
version: openapi3
# 第二种配置方式:手动配置
knife4j:
gateway:
enabled: true
strategy: manual
operations-sorter: order
routes:
- name: 用户服务
context-path: /user
url: /user/v3/api-docs/default
- name: 订单管理
context-path: /order
url: /order/v3/api-docs/default2. 子微服务 (service) 配置
确保每个业务微服务都按照 第三部分 的步骤引入了 knife4j-openapi3-jakarta-spring-boot-starter 并正确配置了 packages-to-scan。
3. 访问方式
启动网关和各个微服务后,直接访问 网关的地址 即可查看聚合文档:
http://网关ip:网关端口/doc.html
效果图

到此这篇关于springboot 3.5 集成 knife4j 4.3的详细步骤的文章就介绍到这了,更多相关springboot 集成 knife4j内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论