
作为后端开发者,接口文档编写是绕不开的工作——既要保证文档的准确性、完整性,又要及时同步接口变更,手动编写不仅耗时耗力,还容易出现“接口与文档不一致”的问题,给前后端联调带来极大困扰。
而swagger正是解决这一痛点的利器,它能自动扫描项目中的接口,生成标准化的api文档,支持在线调试、接口描述、参数校验等功能;而knife4j则是swagger的增强版,基于swagger封装,优化了ui界面,增加了更多实用功能(如接口排序、导出文档、接口加密等),更贴合国内开发者的使用习惯。
本文将详细讲解springboot如何快速集成knife4j/swagger,从环境搭建、基础配置、接口注解使用,到进阶优化,全程附完整代码示例,新手也能快速上手,彻底告别手写api文档的烦恼!
一、核心优势:为什么选择knife4j而非原生swagger?
原生swagger功能足够基础,但ui界面简陋、交互体验一般,而knife4j作为增强版,完美解决了这些问题,核心优势如下:
- ui更美观,交互更友好:替换原生swagger的简陋界面,采用现代化设计,支持接口搜索、分类、排序,操作更流畅。
- 功能更强大:支持接口文档导出(pdf/markdown/html)、接口调试参数记忆、接口加密、全局参数配置等原生swagger没有的功能。
- 配置更简洁:基于springboot自动配置,无需复杂xml配置,几行代码即可完成集成。
- 兼容性更好:完美兼容springboot 2.x、3.x版本,支持jdk8及以上,适配主流的spring全家桶。
简单来说:knife4j = swagger + 更优ui + 更多实用功能,是springboot项目接口文档的首选方案。
二、环境准备
本次集成基于以下环境,其他版本可灵活适配(文末附版本兼容说明):
- springboot版本:2.7.10(兼容2.x、3.x,3.x配置略有差异,下文会说明)
- knife4j版本:4.5.0(最新稳定版)
- jdk版本:1.8及以上
- 开发工具: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配置类
创建一个配置类,用于配置swagger的基础信息(如文档标题、作者、版本)、扫描的接口包、全局参数等。该类需添加@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实例,指定接口文档的基本信息和扫描规则
*/
@bean
public docket createrestapi() {
return new docket(documentationtype.oas_30) // oas_30对应swagger3.0规范,推荐使用
.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("本文档用于前后端联调,自动生成接口信息,无需手写") // 文档描述
.contact(new contact("开发者", "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规范,是目前的主流版本,兼容knife4j的所有功能。
步骤3:接口添加swagger注解(核心)
swagger通过注解识别接口信息,为controller、接口方法、参数添加注解,即可自动生成详细的接口文档。以下是常用注解及示例:
常用注解说明
| 注解 | 作用范围 | 说明 |
|---|---|---|
| @api | controller类 | 描述controller的作用(如“用户管理接口”) |
| @apioperation | 接口方法 | 描述接口的功能(如“查询用户列表”) |
| @apiparam | 接口参数 | 描述参数的含义、是否必填、默认值等 |
| @apimodel | 实体类 | 描述实体类的作用(如“用户实体”) |
| @apimodelproperty | 实体类字段 | 描述字段的含义、数据类型、是否必填等 |
| @apiignore | controller/方法/参数 | 忽略该接口/参数,不生成到文档中 |
实战示例(controller + 实体类)
首先创建实体类(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;
}然后创建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 {
// 模拟数据库数据
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;
}
/**
* 根据id查询用户
*/
@getmapping("/{id}")
@apioperation(value = "根据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分组),可搜索、折叠接口;
- 中间:接口详情(请求方式、参数、返回值、示例等);
- 右侧:在线调试(可直接填写参数,发送请求,查看响应结果,无需借助postman)。
核心功能:
- 在线调试:填写参数后,点击“发送”即可测试接口,支持get、post、put、delete等所有请求方式;
- 文档导出:点击界面顶部“导出”按钮,可导出pdf、markdown、html格式的接口文档,方便离线查看;
- 参数校验:接口参数的必填项、示例值会自动显示,减少前后端联调的沟通成本。
五、进阶配置(优化体验,避坑指南)
以下配置可根据项目需求选择性添加,进一步优化knife4j/swagger的使用体验,避免常见坑。
1. 全局参数配置(如token、authorization)
若项目接口需要登录认证(如token),可在配置类中添加全局参数,无需在每个接口单独添加:
// 在swaggerconfig的createrestapi方法中添加
.addglobalparameters(collections.singletonlist(
new parameterbuilder()
.name("authorization") // 参数名
.description("令牌(格式:bearer token)") // 参数描述
.in(parametertype.header) // 参数位置(header/query/path)
.required(false) // 是否必填(根据项目需求调整)
.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及以上版本,默认的路径匹配策略发生变化,会导致swagger启动报错,需在application.yml中添加以下配置:
spring:
mvc:
pathmatch:
matching-strategy: ant_path_matcher4. 生产环境关闭swagger文档
swagger文档仅用于开发和测试环境,生产环境需关闭,避免接口暴露带来安全风险。可通过配置文件控制:
# application-dev.yml(开发环境,开启) knife4j: enable: true # application-prod.yml(生产环境,关闭) knife4j: enable: false
同时,在配置类中添加条件注解,根据环境动态开启/关闭:
@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:接口文档中没有显示实体类参数
- 解决方案:确保实体类添加了@apimodel和@apimodelproperty注解,且接口参数使用@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步即可实现接口文档的自动生成,彻底告别手写文档的繁琐工作,大幅提升前后端联调效率。
本文从基础集成、注解使用,到进阶配置、避坑指南,覆盖了开发中常用的所有场景,新手可直接复制代码上手,资深开发者可根据项目需求进行个性化配置。
核心要点:
- knife4j是swagger的增强版,ui更友好、功能更强大;
- 核心是通过注解(@api、@apioperation等)描述接口信息,swagger自动扫描生成文档;
- 生产环境必须关闭swagger,避免安全风险;
- springboot 2.x和3.x配置略有差异,需注意依赖和注解的适配。
掌握knife4j/swagger的使用,能让后端开发者从繁琐的文档编写中解放出来,专注于核心业务逻辑开发,提升整体开发效率。赶紧动手集成到你的springboot项目中吧!
到此这篇关于springboot集成knife4j/swagger:接口文档自动生成,告别手写api文档的文章就介绍到这了,更多相关springboot集成knife4j/swagger内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论