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

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

