SpringBoot集成Knife4j/Swagger:接口文檔自動生成,告別手寫API文檔

作為后端開發(fā)者,接口文檔編寫是繞不開的工作——既要保證文檔的準確性、完整性,又要及時同步接口變更,手動編寫不僅耗時耗力,還容易出現(xiàn)“接口與文檔不一致”的問題,給前后端聯(lián)調帶來極大困擾。
而Swagger正是解決這一痛點的利器,它能自動掃描項目中的接口,生成標準化的API文檔,支持在線調試、接口描述、參數(shù)校驗等功能;而Knife4j則是Swagger的增強版,基于Swagger封裝,優(yōu)化了UI界面,增加了更多實用功能(如接口排序、導出文檔、接口加密等),更貼合國內開發(fā)者的使用習慣。
本文將詳細講解SpringBoot如何快速集成Knife4j/Swagger,從環(huán)境搭建、基礎配置、接口注解使用,到進階優(yōu)化,全程附完整代碼示例,新手也能快速上手,徹底告別手寫API文檔的煩惱!
一、核心優(yōu)勢:為什么選擇Knife4j而非原生Swagger?
原生Swagger功能足夠基礎,但UI界面簡陋、交互體驗一般,而Knife4j作為增強版,完美解決了這些問題,核心優(yōu)勢如下:
- UI更美觀,交互更友好:替換原生Swagger的簡陋界面,采用現(xiàn)代化設計,支持接口搜索、分類、排序,操作更流暢。
- 功能更強大:支持接口文檔導出(PDF/Markdown/HTML)、接口調試參數(shù)記憶、接口加密、全局參數(shù)配置等原生Swagger沒有的功能。
- 配置更簡潔:基于SpringBoot自動配置,無需復雜XML配置,幾行代碼即可完成集成。
- 兼容性更好:完美兼容SpringBoot 2.x、3.x版本,支持JDK8及以上,適配主流的Spring全家桶。
簡單來說:Knife4j = Swagger + 更優(yōu)UI + 更多實用功能,是SpringBoot項目接口文檔的首選方案。
二、環(huán)境準備
本次集成基于以下環(huán)境,其他版本可靈活適配(文末附版本兼容說明):
- SpringBoot版本:2.7.10(兼容2.x、3.x,3.x配置略有差異,下文會說明)
- Knife4j版本:4.5.0(最新穩(wěn)定版)
- JDK版本:1.8及以上
- 開發(fā)工具:IDEA
三、SpringBoot集成Knife4j/Swagger(步驟詳解)
集成過程分為3步:添加依賴 → 編寫配置類 → 接口添加注解,全程無復雜操作,直接復制代碼即可。
步驟1:添加Maven依賴
在pom.xml中添加Knife4j的依賴,無需額外添加Swagger依賴(Knife4j已內置Swagger核心依賴,避免版本沖突)。
<!-- Knife4j Swagger 增強版依賴 -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>4.5.0</version>
</dependency>
<!-- 若使用SpringBoot 3.x,需替換為以下依賴(適配Jakarta EE) -->
<!-- <dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>4.5.0</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency> -->注意:SpringBoot 3.x版本需排除javax.servlet-api依賴,因為3.x已使用Jakarta EE的jakarta.servlet-api,避免依賴沖突。
步驟2:編寫Swagger配置類
創(chuàng)建一個配置類,用于配置Swagger的基礎信息(如文檔標題、作者、版本)、掃描的接口包、全局參數(shù)等。該類需添加@Configuration注解,注入Docket實例。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
/**
* Knife4j/Swagger 配置類
*/
@Configuration
@EnableOpenApi // 開啟Swagger文檔(SpringBoot 3.x無需額外添加,2.x需添加)
public class SwaggerConfig {
/**
* 配置Docket實例,指定接口文檔的基本信息和掃描規(guī)則
*/
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30) // OAS_30對應Swagger3.0規(guī)范,推薦使用
.apiInfo(apiInfo()) // 配置文檔基礎信息
.select()
// 掃描指定包下的接口(替換為你的接口所在包路徑)
.apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
// 掃描所有接口(不推薦,建議指定包)
// .apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any()) // 匹配所有接口路徑
.build();
}
/**
* 配置文檔的基礎信息(標題、作者、版本、描述等)
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("SpringBoot + Knife4j/Swagger 接口文檔") // 文檔標題
.description("本文檔用于前后端聯(lián)調,自動生成接口信息,無需手寫") // 文檔描述
.contact(new Contact("開發(fā)者", "https://blog.csdn.net", "xxx@163.com")) // 作者信息(姓名、博客地址、郵箱)
.version("1.0.0") // 文檔版本
.build();
}
}關鍵說明:
- @EnableOpenApi:開啟Swagger文檔功能,SpringBoot 2.x必須添加,3.x版本可省略(Knife4j自動開啟)。
- basePackage:必須替換為你項目中Controller所在的包路徑,否則Swagger無法掃描到接口。
- DocumentationType.OAS_30:使用Swagger3.0規(guī)范,是目前的主流版本,兼容Knife4j的所有功能。
步驟3:接口添加Swagger注解(核心)
Swagger通過注解識別接口信息,為Controller、接口方法、參數(shù)添加注解,即可自動生成詳細的接口文檔。以下是常用注解及示例:
常用注解說明
| 注解 | 作用范圍 | 說明 |
|---|---|---|
| @Api | Controller類 | 描述Controller的作用(如“用戶管理接口”) |
| @ApiOperation | 接口方法 | 描述接口的功能(如“查詢用戶列表”) |
| @ApiParam | 接口參數(shù) | 描述參數(shù)的含義、是否必填、默認值等 |
| @ApiModel | 實體類 | 描述實體類的作用(如“用戶實體”) |
| @ApiModelProperty | 實體類字段 | 描述字段的含義、數(shù)據(jù)類型、是否必填等 |
| @ApiIgnore | Controller/方法/參數(shù) | 忽略該接口/參數(shù),不生成到文檔中 |
實戰(zhàn)示例(Controller + 實體類)
首先創(chuàng)建實體類(User),添加@ApiModel和@ApiModelProperty注解:
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 用戶實體類
*/
@Data
@ApiModel(value = "User", description = "用戶實體")
public class User {
@ApiModelProperty(value = "用戶ID", example = "1", required = false)
private Long id;
@ApiModelProperty(value = "用戶名", example = "zhangsan", required = true)
private String username;
@ApiModelProperty(value = "用戶密碼", example = "123456", required = true)
private String password;
@ApiModelProperty(value = "用戶年齡", example = "20", required = false)
private Integer age;
}然后創(chuàng)建Controller,添加@Api、@ApiOperation、@ApiParam注解:
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
/**
* 用戶管理接口
*/
@RestController
@RequestMapping("/user")
@Api(tags = "用戶管理接口", description = "提供用戶的增刪改查操作")
public class UserController {
// 模擬數(shù)據(jù)庫數(shù)據(jù)
private static final List<User> userList = new ArrayList<>();
static {
userList.add(new User(1L, "zhangsan", "123456", 20));
userList.add(new User(2L, "lisi", "654321", 22));
}
/**
* 查詢所有用戶
*/
@GetMapping("/list")
@ApiOperation(value = "查詢用戶列表", notes = "獲取所有用戶的詳細信息")
public List<User> getUserList() {
return userList;
}
/**
* 根據(jù)ID查詢用戶
*/
@GetMapping("/{id}")
@ApiOperation(value = "根據(jù)ID查詢用戶", notes = "傳入用戶ID,獲取單個用戶信息")
public User getUserById(@ApiParam(value = "用戶ID", required = true, example = "1") @PathVariable Long id) {
return userList.stream().filter(user -> user.getId().equals(id)).findFirst().orElse(null);
}
/**
* 添加用戶
*/
@PostMapping("/add")
@ApiOperation(value = "添加用戶", notes = "傳入用戶信息,新增用戶")
public String addUser(@ApiParam(value = "用戶信息", required = true) @RequestBody User user) {
userList.add(user);
return "添加成功";
}
/**
* 修改用戶
*/
@PutMapping("/update")
@ApiOperation(value = "修改用戶", notes = "傳入用戶ID和新信息,修改用戶")
public String updateUser(@ApiParam(value = "用戶信息", required = true) @RequestBody User user) {
userList.replaceAll(u -> u.getId().equals(user.getId()) ? user : u);
return "修改成功";
}
/**
* 刪除用戶
*/
@DeleteMapping("/{id}")
@ApiOperation(value = "刪除用戶", notes = "傳入用戶ID,刪除指定用戶")
public String deleteUser(@ApiParam(value = "用戶ID", required = true, example = "1") @PathVariable Long id) {
userList.removeIf(user -> user.getId().equals(id));
return "刪除成功";
}
}四、啟動項目,訪問Knife4j文檔
- 啟動SpringBoot項目,確保項目無報錯;
- 訪問Knife4j文檔地址(默認地址,無需修改):
http://localhost:8080/doc.html
(注:若項目配置了server.port,需替換為你的端口號;若配置了上下文路徑,需添加上下文路徑,如http://localhost:8080/demo/doc.html)
文檔界面說明
訪問成功后,將看到Knife4j的可視化界面,主要分為3個部分:
- 左側:接口分類(按Controller分組),可搜索、折疊接口;
- 中間:接口詳情(請求方式、參數(shù)、返回值、示例等);
- 右側:在線調試(可直接填寫參數(shù),發(fā)送請求,查看響應結果,無需借助Postman)。
核心功能:
- 在線調試:填寫參數(shù)后,點擊“發(fā)送”即可測試接口,支持GET、POST、PUT、DELETE等所有請求方式;
- 文檔導出:點擊界面頂部“導出”按鈕,可導出PDF、Markdown、HTML格式的接口文檔,方便離線查看;
- 參數(shù)校驗:接口參數(shù)的必填項、示例值會自動顯示,減少前后端聯(lián)調的溝通成本。
五、進階配置(優(yōu)化體驗,避坑指南)
以下配置可根據(jù)項目需求選擇性添加,進一步優(yōu)化Knife4j/Swagger的使用體驗,避免常見坑。
1. 全局參數(shù)配置(如Token、Authorization)
若項目接口需要登錄認證(如Token),可在配置類中添加全局參數(shù),無需在每個接口單獨添加:
// 在SwaggerConfig的createRestApi方法中添加
.addGlobalParameters(Collections.singletonList(
new ParameterBuilder()
.name("Authorization") // 參數(shù)名
.description("令牌(格式:Bearer token)") // 參數(shù)描述
.in(ParameterType.HEADER) // 參數(shù)位置(HEADER/QUERY/PATH)
.required(false) // 是否必填(根據(jù)項目需求調整)
.schema(new Schema<String>().type("string"))
.build()
))
2. 忽略指定接口/路徑
若某些接口(如登錄接口、錯誤頁接口)不需要生成文檔,可通過以下方式忽略:
- 方式1:在接口方法上添加@ApiIgnore注解;
- 方式2:在配置類中通過paths過濾:
// 排除/login和/error接口
.paths(PathSelectors.regex("^(?!/login|/error).*$"))
3. 解決SpringBoot 2.6.x+ 版本沖突問題
SpringBoot 2.6.x及以上版本,默認的路徑匹配策略發(fā)生變化,會導致Swagger啟動報錯,需在application.yml中添加以下配置:
spring:
mvc:
pathmatch:
matching-strategy: ant_path_matcher4. 生產(chǎn)環(huán)境關閉Swagger文檔
Swagger文檔僅用于開發(fā)和測試環(huán)境,生產(chǎn)環(huán)境需關閉,避免接口暴露帶來安全風險??赏ㄟ^配置文件控制:
# application-dev.yml(開發(fā)環(huán)境,開啟) knife4j: enable: true # application-prod.yml(生產(chǎn)環(huán)境,關閉) knife4j: enable: false
同時,在配置類中添加條件注解,根據(jù)環(huán)境動態(tài)開啟/關閉:
@Configuration
@EnableOpenApi
@ConditionalOnProperty(prefix = "knife4j", name = "enable", havingValue = "true")
public class SwaggerConfig {
// 配置內容不變
}
六、常見問題與解決方案
- 問題1:啟動項目后,訪問/doc.html報404
- 解決方案:1. 檢查Controller包路徑是否配置正確(basePackage);2. 檢查Knife4j依賴是否添加成功;3. 若使用SpringBoot 2.6.x+,檢查是否添加了路徑匹配策略配置。
- 問題2:接口文檔中沒有顯示實體類參數(shù)
- 解決方案:確保實體類添加了@ApiModel和@ApiModelProperty注解,且接口參數(shù)使用@RequestBody接收實體類。
- 問題3:SpringBoot 3.x啟動報錯,提示javax.servlet相關錯誤
- 解決方案:排除Knife4j依賴中的javax.servlet-api,使用Jakarta EE的依賴(參考步驟1的依賴配置)。
- 問題4:在線調試時,響應結果亂碼
解決方案:在application.yml中配置字符編碼:spring: http: encoding: charset: UTF-8 force: true
七、總結
SpringBoot集成Knife4j/Swagger,僅需3步即可實現(xiàn)接口文檔的自動生成,徹底告別手寫文檔的繁瑣工作,大幅提升前后端聯(lián)調效率。
本文從基礎集成、注解使用,到進階配置、避坑指南,覆蓋了開發(fā)中常用的所有場景,新手可直接復制代碼上手,資深開發(fā)者可根據(jù)項目需求進行個性化配置。
核心要點:
- Knife4j是Swagger的增強版,UI更友好、功能更強大;
- 核心是通過注解(@Api、@ApiOperation等)描述接口信息,Swagger自動掃描生成文檔;
- 生產(chǎn)環(huán)境必須關閉Swagger,避免安全風險;
- SpringBoot 2.x和3.x配置略有差異,需注意依賴和注解的適配。
掌握Knife4j/Swagger的使用,能讓后端開發(fā)者從繁瑣的文檔編寫中解放出來,專注于核心業(yè)務邏輯開發(fā),提升整體開發(fā)效率。趕緊動手集成到你的SpringBoot項目中吧!
到此這篇關于SpringBoot集成Knife4j/Swagger:接口文檔自動生成,告別手寫API文檔的文章就介紹到這了,更多相關SpringBoot集成Knife4j/Swagger內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java實現(xiàn)微信小程序加密數(shù)據(jù)解密算法
我們開發(fā)微信小程序的過程中,我們的服務端有時需要獲取微信提供的開放數(shù)據(jù)。微信會對這些開放數(shù)據(jù)做簽名和加密處理,本文通過實例代碼給大家介紹Java實現(xiàn)微信小程序加密數(shù)據(jù)解密算法,感興趣的朋友一起看看吧2021-11-11
spring boot攔截器實現(xiàn)IP黑名單實例代碼
本篇文章主要介紹了spring boot攔截器實現(xiàn)IP黑名單實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
Spring Security如何使用URL地址進行權限控制
這篇文章主要介紹了Spring Security如何使用URL地址進行權限控制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-12-12
JavaMail整合Spring實現(xiàn)郵件發(fā)送功能
這篇文章主要為大家詳細介紹了JavaMail整合Spring實現(xiàn)郵件發(fā)送功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08

