# springboot-knife-2.7.18
**Repository Path**: enzoism/springboot-knife-2.7.18
## Basic Information
- **Project Name**: springboot-knife-2.7.18
- **Description**: springboot2.7.18使用Swagger的高阶版本:knife
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-10-30
- **Last Updated**: 2026-10-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Spring Boot 2.7 集成 Swagger 接口文档完整指南(knife4j + OpenAPI3)
> 1-knife4j和swagger关系->Knife4j 是 Swagger 生态的增强 UI 前端
>
> 2-SpringBoot集成knife4j->【添加依赖】+【配置knife4j开发】+【配置SwaggerConfig】
>
> ````
>
>
> com.github.xiaoymin
> knife4j-openapi3-spring-boot-starter
> 4.4.0
>
> ````
>
> 3-地址访问:
>
> - knife4j 增强文档(推荐):http://localhost:8076/doc.html
> - wagger 官方 UI:http://localhost:8076/swagger-ui/index.html
- knife4j 增强文档(推荐):http://localhost:8076/doc.html

- Swagger 官方 UI:http://localhost:8076/swagger-ui/index.html

---
# 1-集成knife4j + OpenAPI3
## 一、最终效果
启动项目后,浏览器访问:
- **knife4j 增强文档(推荐)**:http://localhost:8076/doc.html
- OpenAPI3 原始 JSON:http://localhost:8076/v3/api-docs
- Swagger 官方 UI:http://localhost:8076/swagger-ui/index.html
在文档页面中可以直接看到接口分组(`@Tag`)、接口说明(`@Operation`)、出入参结构(实体自动解析),并支持在线调试。
---
## 二、验证环境一览
本工程实测通过的版本组合如下(`mvn dependency:tree` 实际输出):
| 组件 | 版本 | 说明 |
| ------------------- | ---------- | ------------------------------------------------------------ |
| JDK | **1.8** | `pom.xml` 中 `1.8` |
| Spring Boot | **2.7.18** | 2.x 的最后一个正式版本,兼容 JDK 8 |
| knife4j | **4.4.0** | `knife4j-openapi3-spring-boot-starter`,增强版 Swagger UI |
| springdoc-openapi | **1.7.0** | knife4j 传递引入,OpenAPI3 规范的 Spring 实现 |
| swagger-annotations | **2.2.9** | knife4j 传递引入,`io.swagger.v3.oas.annotations.*` 注解包来源 |
| swagger-ui | 4.18.2 | knife4j 传递引入的官方 UI(备用) |
| 构建工具 | Maven | Spring Boot 官方 parent 管理版本 |
依赖关系一句话总结:
```
knife4j-openapi3-spring-boot-starter:4.4.0
├─ knife4j-core / knife4j-openapi3-ui (knife4j 增强文档 /doc.html)
└─ springdoc-openapi-ui:1.7.0
├─ springdoc-openapi-common / webmvc-core (扫描 Controller 生成 OpenAPI3 JSON)
│ └─ swagger-core / swagger-annotations:2.2.9 (@Tag/@Operation/@Schema 等注解)
└─ swagger-ui:4.18.2 (官方 UI /swagger-ui/index.html)
```
> 只需要官方 UI、不需要 knife4j 增强功能的话,直接引入 `org.springdoc:springdoc-openapi-ui:1.7.0` 也可以,注解用法完全相同。
---
## 三、版本选型说明(重要)
### 3.1 Spring Boot 2.x 和 3.x 用不同的 starter
knife4j 4.x 针对不同 Spring Boot 大版本提供了两个 starter,**不能混用**:
| Spring Boot 版本 | 应使用的依赖 | 底层 | 包名空间 |
| -------------------- | ---------------------------------------------- | --------------------- | ----------- |
| 2.x(本工程 2.7.18) | `knife4j-openapi3-spring-boot-starter` | springdoc-openapi 1.x | `javax.*` |
| 3.x | `knife4j-openapi3-jakarta-spring-boot-starter` | springdoc-openapi 2.x | `jakarta.*` |
Spring Boot 3 从 `javax.*` 换成了 `jakarta.*`,所以老 starter 在 Spring Boot 3 下无法工作;反之亦然。**先确定 Spring Boot 大版本,再选 starter**。
### 3.2 OpenAPI3 注解 vs 旧版 Swagger2 注解
网上大量旧教程使用 springfox 的 `@Api` / `@ApiOperation`(Swagger2 规范),springfox 已停止维护且与新版 JDK 不兼容。本工程采用 **OpenAPI3 规范(springdoc)**,注解全部来自 `io.swagger.v3.oas.annotations` 包。新旧注解对照:
| 旧版 Swagger2(springfox,不推荐) | 新版 OpenAPI3(本工程使用) | 用途 |
| ---------------------------------- | -------------------------------------------------- | ------------------------- |
| `@Api(tags = "...")` | `@Tag(name = "...", description = "...")` | 标注 Controller,生成分组 |
| `@ApiOperation("...")` | `@Operation(summary = "...", description = "...")` | 标注接口方法 |
| `@ApiModel` | `@Schema`(标在实体类上) | 标注出入参实体 |
| `@ApiModelProperty("...")` | `@Schema`(标在实体字段上) | 标注字段含义 |
| `@ApiParam` | `@Parameter` | 标注单个参数 |
| `@ApiImplicitParams` | `@Parameters` | 标注多个参数 |
| `@ApiResponses` / `@ApiResponse` | `@ApiResponses` / `@ApiResponse`(包不同) | 标注响应码说明 |
---
## 四、快速开始(三步接入)
### 步骤 1:添加 Maven 依赖
`pom.xml` 关键内容(Spring Boot 版本由 parent 统一管理,knife4j 需显式指定版本):
```xml
org.springframework.boot
spring-boot-starter-parent
2.7.18
1.8
org.springframework.boot
spring-boot-starter-web
com.github.xiaoymin
knife4j-openapi3-spring-boot-starter
4.4.0
org.projectlombok
lombok
true
```
> 无需额外引入 springdoc 或 swagger-annotations,knife4j starter 已全部传递引入。
### 步骤 2:编写配置文件
`src/main/resources/application.yaml`:
```yaml
server:
port: 8076
knife4j:
# 开启 knife4j 增强模式(doc.html 的高级功能)
enable: true
```
`knife4j.enable: true` 开启增强模式后,`/doc.html` 可使用全局参数、接口排序、缓存等高级功能;不开也能正常看文档。
### 步骤 3:声明全局文档信息
新建 `SwaggerConfig`,通过 `OpenAPI` Bean 配置文档标题、描述、版本等元信息:
```java
package com.enzoism.springboot.config;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* knife4j(Swagger) 文档配置
* 启动后访问 http://localhost:8076/doc.html 查看并调试接口
*/
@Configuration
public class SwaggerConfig {
@Bean
public OpenAPI openAPI() {
return new OpenAPI().info(new Info()
.title("接口文档标题") // 文档页顶部标题,按项目自定义
.description("接口文档描述信息") // 文档页说明文字,按项目自定义
.version("1.0.0"));
}
}
```
到这里接入就完成了,**不加任何注解文档也能生成**(springdoc 会自动扫描所有 `@RestController`),注解只是让文档更易读。启动验证:
```bash
mvn spring-boot:run
# 或者 IDE 直接运行启动类
```
启动类就是普通的 Spring Boot 写法,没有任何特殊之处:
```java
@SpringBootApplication
public class UsrApplication {
public static void main(String[] args) {
SpringApplication.run(UsrApplication.class, args);
}
}
```
---
## 五、如何添加 Swagger 标注信息(注解实战)
OpenAPI3 的注解按作用层级分为四类,本工程已实际使用前两类:
| 层级 | 注解 | 作用 |
| ------------- | ------------ | -------------------------------- |
| Controller 类 | `@Tag` | 定义文档中的接口分组名称与描述 |
| 接口方法 | `@Operation` | 定义接口的概要说明与详细描述 |
| 实体类/字段 | `@Schema` | 定义出入参模型的字段含义、示例值 |
| 方法参数 | `@Parameter` | 定义单个请求参数的说明 |
### 5.1 `@Tag` + `@Operation`:Controller 层标注(本工程实际代码)
```java
package com.enzoism.springboot.controller;
import com.enzoism.springboot.common.AjaxResult;
import com.enzoism.springboot.model.UserModel;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Slf4j
@Tag(name = "用户快速调试", description = "验证Swagger") // 类级:文档左侧的接口分组
@RestController
@RequestMapping("/usr")
public class UserController {
@Operation(summary = "查询用户列表", description = "快速验证User用户列表查询") // 方法级:接口条目的名称与说明
@GetMapping("/list")
public AjaxResult send() {
List userModels = UserModel.initUserModels();
return AjaxResult.success(userModels);
}
}
```
两个注解的核心属性:
- `@Tag.name`:分组名称(必填);`description`:分组补充描述。
- `@Operation.summary`:接口一句话概要,显示为接口条目名称;`description`:点开后的详细说明。
### 5.2 `@Schema`:实体层标注(推荐补充)
出入参实体默认只展示字段名和类型,加上 `@Schema` 后会显示字段中文含义和示例值,文档可读性大幅提升。以本工程的 `UserModel` 为例,标注后的写法:
```java
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "用户实体")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserModel {
@Schema(description = "用户ID", example = "1")
private Integer id;
@Schema(description = "年龄", example = "18")
private Integer age;
@Schema(description = "用户名", example = "zhangsan")
private String name;
public static List initUserModels() {
return Arrays.asList(
new UserModel(1, 18, "zhangsan"),
new UserModel(2, 19, "lisi"),
new UserModel(3, 20, "wangwu")
);
}
}
```
> 统一响应体同样建议标注,例如给 `AjaxResult` 的 `code` / `msg` / `data` 字段加上 `@Schema(description = "状态码")` 等,响应示例会更清晰。
### 5.3 `@Parameter`:参数级标注
GET 查询参数、路径参数的说明用 `@Parameter`:
```java
@Operation(summary = "按ID查询用户")
@GetMapping("/{id}")
public AjaxResult getById(
@Parameter(description = "用户ID", required = true, example = "1")
@PathVariable Integer id) {
return AjaxResult.success();
}
```
POST 请求体的字段说明则回到 `@Schema`,由框架自动把实体字段文档挂到接口的 Request Body 下。
---
## 六、启动与调试流程
1. 启动应用(IDE 运行 `UsrApplication`,或 `mvn spring-boot:run`)。
2. 打开 http://localhost:8076/doc.html 。
3. 左侧按 `@Tag` 分组浏览接口,接口条目名称来自 `@Operation.summary`。
4. 点击接口 → 「调试」Tab → 「发送」,即可在页面内直接发起请求并查看响应(端口为 `application.yaml` 中配置的 8076)。
---
## 七、常见问题(FAQ)
**1. 访问 `/doc.html` 返回 404?**
- 确认引入的是 `knife4j-openapi3-spring-boot-starter`(缺 knife4j 时只有 `/swagger-ui/index.html`,没有 `/doc.html`);
- 确认 `application.yaml` 中 `knife4j.enable: true`;
- 确认项目有拦截器/安全框架放行了 `/doc.html`、`/v3/api-docs`、`/swagger-ui/**`、`/webjars/**`。
**2. 文档 JSON 地址是什么?**
`/v3/api-docs`,返回 OpenAPI3 规范的 JSON,可导入 Apifox、Postman 等工具。
**3. 生产环境如何关闭文档?**
在对应环境的配置中关闭 springdoc 即可:
```yaml
springdoc:
api-docs:
enabled: false
```
(关闭后 `/doc.html` 无数据可加载,如需彻底隐藏可再配合拦截器屏蔽相关路径。)
**4. Spring Boot 3 项目能直接用本工程的依赖吗?**
不能。Spring Boot 3 需换成 `knife4j-openapi3-jakarta-spring-boot-starter`(内置 springdoc 2.x),注解写法不变。
**5. 项目里已经有 springfox(`@EnableSwagger2`)会冲突吗?**
会。springfox 与 springdoc 扫描机制冲突,二选一。建议迁移到本工程的 OpenAPI3 方案,按第三章的对照表替换注解即可。
---
## 八、工程结构速览
```
20261030SpringBoot-Swagger
├── pom.xml # Spring Boot 2.7.18 + knife4j 4.4.0
└── src/main
├── java/com/enzoism/springboot
│ ├── UsrApplication.java # 启动类
│ ├── config/SwaggerConfig.java # OpenAPI Bean:文档元信息
│ ├── controller/UserController.java # @Tag + @Operation 标注示例
│ ├── model/UserModel.java # 出入参实体
│ └── common/AjaxResult.java # 统一响应体
└── resources/application.yaml # 端口 + knife4j 增强
```
## 九、总结
- **版本组合**:JDK 1.8 + Spring Boot 2.7.18 + `knife4j-openapi3-spring-boot-starter` 4.4.0(内置 springdoc 1.7.0),这是一套经过本工程实际运行验证的稳定组合。
- **接入成本**:一个依赖、两行配置、一个 `OpenAPI` Bean,三步完成,不加注解也有完整文档。
- **注解体系**:类上 `@Tag`、方法上 `@Operation`、实体和字段上 `@Schema`、参数上 `@Parameter`,全部来自 `io.swagger.v3.oas.annotations` 包。
- **版本红线**:Spring Boot 2.x 与 3.x 的 starter 不能混用;不要与 springfox 混存于同一项目。
---
# 2-Knife4j和Swagger之间是什么关系
## 两者关系:Knife4j 是 Swagger 生态的增强 UI 前端
简单来说:**Swagger 提供 API 文档的标准和生成能力,Knife4j 是在其之上的增强版文档展示界面**。Knife4j 本身不生成 API 文档数据,它消费 Swagger/OpenAPI 产出的规范数据,用更友好的界面渲染出来。
### 各自的角色
**Swagger(现称 OpenAPI 生态)**
- 是一套 API 文档规范(OpenAPI Specification)加上围绕它的工具链:Swagger UI、Swagger Editor、Codegen 等。
- 在 Java 中,通常通过 Springfox 或 SpringDoc 这类库扫描代码注解(如 `@ApiOperation`、`@Operation`),生成符合 OpenAPI 规范的 JSON 数据(`/v2/api-docs` 或 `/v3/api-docs`)。
- 自带的 Swagger UI 是纯英文界面,功能比较基础。
**Knife4j**
- 前身叫 `swagger-bootstrap-ui`,是一个中国开发者(萧明)主导的开源项目,2020 年更名为 Knife4j。
- 它是一个**前端 UI 增强方案**,底层仍然依赖 Springfox/SpringDoc 生成的 OpenAPI 数据,只是替换了展示层。
- 可以理解为给 Swagger 换了一个功能更强的"皮肤",但又不只是皮肤。
### Knife4j 相比原生 Swagger UI 的增强
- 中文界面,更符合国内团队习惯
- 接口调试功能更强(类似 Postman,支持参数缓存、全局参数、自定义请求头)
- 支持文档导出(Markdown、Word、PDF、HTML)
- 接口排序、分组、搜索、离线文档
- 支持多文档源聚合(微服务网关下聚合各服务的文档)
- 支持动态参数、增强的注解(如 `@ApiOperationSupport`、`@ApiSupport` 控制排序等)
### 典型集成方式
```xml
com.github.xiaoymin
knife4j-spring-boot-starter
2.0.9
```
引入后访问 `/doc.html` 就是 Knife4j 界面,而原生的 `/swagger-ui.html` 依然可用——这也说明两者是**共存关系,Knife4j 只是替换了展示层**。
### 一句话总结
> Swagger/OpenAPI 是标准和数据生产者,Knife4j 是站在它之上的增强型文档 UI。没有 Swagger(Springfox/SpringDoc)生成的规范数据,Knife4j 无米下锅;有了 Knife4j,Swagger 文档在国内团队里变得好用得多。
----