最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2026年03月30日 10:06:48   作者:翹著二郎腿的程序猿  
本文將詳細(xì)講解SpringBoot如何快速集成Knife4j/Swagger,從環(huán)境搭建、基礎(chǔ)配置、接口注解使用,到進(jìn)階優(yōu)化,全程附完整代碼示例,感興趣的朋友跟隨小編一起看看吧

作為后端開發(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ì)的接口文檔。以下是常用注解及示例:

常用注解說明

注解作用范圍說明
@ApiController類描述Controller的作用(如“用戶管理接口”)
@ApiOperation接口方法描述接口的功能(如“查詢用戶列表”)
@ApiParam接口參數(shù)描述參數(shù)的含義、是否必填、默認(rèn)值等
@ApiModel實(shí)體類描述實(shí)體類的作用(如“用戶實(shí)體”)
@ApiModelProperty實(shí)體類字段描述字段的含義、數(shù)據(jù)類型、是否必填等
@ApiIgnoreController/方法/參數(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_matcher

4. 生產(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

    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ù)解密算法

    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í)例代碼

    本篇文章主要介紹了spring boot攔截器實(shí)現(xiàn)IP黑名單實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Java工具類DateUtils實(shí)例詳解

    Java工具類DateUtils實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了Java工具類DateUtils實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Spring Security如何使用URL地址進(jìn)行權(quán)限控制

    Spring Security如何使用URL地址進(jìn)行權(quán)限控制

    這篇文章主要介紹了Spring Security如何使用URL地址進(jìn)行權(quán)限控制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java動(dòng)態(tài)代理簡(jiǎn)單介紹

    Java動(dòng)態(tài)代理簡(jiǎn)單介紹

    動(dòng)態(tài)代理指的是,代理類和目標(biāo)類的關(guān)系在程序運(yùn)行的時(shí)候確定的,客戶通過代理類來調(diào)用目標(biāo)對(duì)象的方法,是在程序運(yùn)行時(shí)根據(jù)需要?jiǎng)討B(tài)的創(chuàng)建目標(biāo)類的代理對(duì)象。本文將通過案例詳細(xì)講解一下Java動(dòng)態(tài)代理的原理及實(shí)現(xiàn),需要的可以參考一下
    2022-08-08
  • JavaMail整合Spring實(shí)現(xiàn)郵件發(fā)送功能

    JavaMail整合Spring實(shí)現(xiàn)郵件發(fā)送功能

    這篇文章主要為大家詳細(xì)介紹了JavaMail整合Spring實(shí)現(xiàn)郵件發(fā)送功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • springboot-mysql-HikariCP集成過程

    springboot-mysql-HikariCP集成過程

    HiKariCP opens new window是數(shù)據(jù)庫連接池的一個(gè)后起之秀,號(hào)稱性能最好,可以完美地 PK 掉其他連接池,這篇文章主要介紹了springboot-mysql-HikariCP集成過程,需要的朋友可以參考下
    2023-07-07
  • Java三大特性之封裝詳解

    Java三大特性之封裝詳解

    面向?qū)ο缶幊陶Z言是對(duì)客觀世界的模擬,客觀世界里成員變量都是隱藏在對(duì)象內(nèi)部的,外界無法直接操作和修改。?封裝可以被認(rèn)為是一個(gè)保護(hù)屏障,防止該類的代碼和數(shù)據(jù)被其他類隨意訪問。本文將來和大家詳細(xì)說說Java中的封裝,需要的可以了解一下
    2022-10-10
  • 你可能真沒用過這些 IDEA 插件(建議收藏)

    你可能真沒用過這些 IDEA 插件(建議收藏)

    IDEA 全稱 IntelliJ IDEA,是java編程語言開發(fā)的集成環(huán)境。IntelliJ在業(yè)界被公認(rèn)為最好的java開發(fā)工具。這篇文章主要介紹 IDEA 必用插件的安裝及用法,需要的朋友可以參考下
    2020-08-08

最新評(píng)論

辽宁省| 金秀| 潍坊市| 武功县| 武定县| 札达县| 龙胜| 柳州市| 武功县| 时尚| 文昌市| 堆龙德庆县| 祥云县| 华池县| 建阳市| 南岸区| 洛川县| 周至县| 酒泉市| 瓮安县| 泾川县| 高州市| 大邑县| 呈贡县| 德清县| 临清市| 辽阳县| 梅河口市| 安顺市| 石阡县| 章丘市| 博兴县| 革吉县| 赣州市| 丰城市| 申扎县| 泰州市| 牟定县| 尼玛县| 台南市| 万载县|