当前位置: 首页 > news >正文

Spring Boot 整合 Knife4j:打造更优雅的 API 文档

  在现代 Web 应用开发中,API 文档的重要性不言而喻。清晰、准确、易用的 API 文档不仅可以方便开发者理解和使用 API,还能提高团队协作效率。Knife4j 是一个基于 Swagger 的增强型 API 文档工具,它可以为 Spring Boot 项目生成美观、易于交互的 API 文档,本文将介绍如何在 Spring Boot 项目中整合 Knife4j,并提供详细的代码示例和最佳实践。

一、为什么选择 Knife4j?

  Knife4j 是一个基于 Swagger 的增强型 API 文档框架,相比于 Swagger UI,Knife4j 提供了更强大的功能和更好的用户体验:

  1. 界面美观: Knife4j 提供了更加美观和现代的界面,使得 API 文档更具吸引力。
  2. 功能强大: Knife4j支持在线调试、参数示例、离线文档导出等多种实用功能。
  3. 易于集成: Knife4j 可以轻松地与 Spring Boot 集成。
  4. 支持多种主题: Knife4j 提供了多种主题,可以自定义 API 文档的风格。
  5. 更好的可读性: Knife4j 在 API文档的呈现上做了优化,使其更易于阅读和理解。

二、Spring Boot 整合 Knife4j实践

2.1 添加 Knife4j 依赖

<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version>
</dependency><dependency><artifactId>guava</artifactId><groupId>com.google.guava</groupId><version>29.0-jre</version>
</dependency>

注意: 请使用合适的版本号,确保你的 Spring Boot 版本与 Knife4j 和 Swagger 兼容。

2.2 创建 Swagger 配置类

import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.RequestHandler;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;@Configuration
@EnableSwagger2
@EnableKnife4j
@ConditionalOnWebApplication
public class SwaggerConfig implements WebMvcConfigurer {/*** 定义分隔符*/private static final String SPLITOR = ";";@Bean(value = "systemApi")public Docket createSystemRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("1.系统管理模块").select().apis(basePackage("com.extend.chk.system.controller")).paths(PathSelectors.any()).build();}@Bean(value = "reportApi")public Docket createReportRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("2.数据可视化模块").select().apis(basePackage("com.extend.chk.report.controller")).paths(PathSelectors.any()).build();}@Bean(value = "warnApi")public Docket createWarnRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("3.预警模块").select().apis(basePackage(("com.extend.chk.warn.controller"))).paths(PathSelectors.any()).build();}private ApiInfo apiInfo() {return new ApiInfoBuilder().description("学习管理平台接口文档").version("v1.0.0").title("学习管理平台接口文档").build();}/*** 重写basePackage方法,使能够实现多包访问* @param basePackage* @return*/public static Predicate<RequestHandler> basePackage(final String basePackage) {return input -> declaringClass(input).transform(handlerPackage(basePackage)).or(true);}private static Function<Class<?>, Boolean> handlerPackage(final String basePackage) {return input -> {// 循环判断匹配for (String strPackage : basePackage.split(SPLITOR)) {boolean isMatch = input.getPackage().getName().startsWith(strPackage);if (isMatch) {return true;}}return false;};}private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {return Optional.fromNullable(input.declaringClass());}/*** 配置静态资源* @param registry*/@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");}
}
  1. @Configuration: 标识这是一个配置类,用来定义 Bean 或其他配置信息。
  2. @EnableSwagger2: 启用 Swagger 2 来生成和管理 RESTful API 的文档。
  3. @EnableKnife4j:增强 Swagger UI 的展示效果,提供更美观、功能更丰富的 API 文档界面。
  4. @ConditionalOnWebApplication:确保上述配置仅在应用程序为 Web 应用时才生效。
  5. @Bean: 创建 Docket Bean,用于配置 Swagger 文档信息。
  6. apiInfo(): 配置 API的基本信息,例如标题、描述、版本号等。
  7. apis(basePackage(("com.extend.chk.warn.controller"))): 指定生成API 文档的 Controller 所在的包。
  8. paths(PathSelectors.any()): 定义路径过滤规则,决定哪些 URL 路径应被包含在文档中,这里设置为所有路径。
  9. groupName("1.系统管理模块"):为生成的 API 分组指定名称。这可以将不同的 API 接口按功能或模块进行分类展示。

2.3 在类上使用 Swagger 注解

2.3.1 在controller里面使用Swagger 注解
@Api(tags = "项目管理")
@RestController
@RequestMapping("/project/manage")
public class ProjectManageController extends BaseController {@Autowiredprivate ProjectManageService ProjectManageService;@ApiOperation(value = "查询项目列表")@GetMapping("/list")public Result<PageDataInfo<ProjectManage>> queryProjectManageList(ProjectManageReq req) {return success(buildPageDataInfo(ProjectManageService.queryProjectManageList(req)));}@ApiOperation(value = "查询项目详情")@GetMapping("/query")public Result<ProjectManage> queryProjectManageById(Integer workspaceId, Integer projectId) {return success(ProjectManageService.queryProjectManageById(workspaceId, projectId));}@ApiOperation(value = "项目新增")@PostMapping(value = "/add")@Log(title = "项目新增", businessType = BusinessType.INSERT)public Result addProjectManage(@Validated @RequestBody ProjectManage ProjectManage) {ProjectManageService.addProjectManage(ProjectManage);return success();}@ApiOperation(value = "项目修改")@PostMapping(value = "/update")@Log(title = "项目修改", businessType = BusinessType.UPDATE)public Result updateProjectManage(@Validated @RequestBody ProjectManage ProjectManage) {ProjectManageService.updateProjectManage(ProjectManage);return success();}@ApiOperation(value = "项目删除")@ApiImplicitParams({@ApiImplicitParam(name = "workspaceId", value = "空间id", required = true),@ApiImplicitParam(name = "projectId", value = "项目id", required = true)})@PutMapping(value = "/delete")@Log(title = "项目删除", businessType = BusinessType.DELETE)public Result operateProjectManage(Integer workspaceId, Integer projectId) {ProjectManageService.operateProjectManage(workspaceId, projectId);return success();}
}
  1. @Api: 用于描述 Controller 的基本信息,例如分类标签。
  2. @ApiOperation: 用于描述 API的基本信息,例如接口名称、描述等。
  3. @ApiImplicitParam: 用于描述 API的参数信息,例如参数名称、类型、是否必填等。
2.3.2 在请求类和返回类里面使用Swagger 注解
@ApiModel(value = "ProjectManage对象", description = "项目管理表")
public class ProjectManage extends BaseEntity<ProjectManage> {private static final long serialVersionUID = 1L;@ApiModelProperty("主键id")private Integer id;@ApiModelProperty("项目名称")private String name;@ApiModelProperty("项目负责人id")private String ownerId;@ApiModelProperty("项目成员id")private String memberId;@ApiModelProperty("工作空间id")private Integer workspaceId;@ApiModelProperty("项目状态(1-有效 2-失效)")private String status;@Overridepublic Serializable pkVal() {return this.id;}
}
  1. @ApiModel:用于描述一个模型类(通常是一个 DTO 或实体类),提供该模型的详细信息,如名称、描述等。它使得生成的 API文档能够清晰地展示数据模型的用途和结构。
  2. @ApiModelProperty:用于描述模型类中的具体字段,指定字段的名称、类型、是否必填、默认值、备注等信息。这有助于开发者更好地理解每个字段的意义和用法。

2.4 访问 Knife4j 文档

启动 Spring Boot 应用,并在浏览器中访问以下地址,即可查看 Knife4j 生成的 API 文档:

http://localhost:8080/extend/doc.html#/home

三、最佳实践

  1. 使用 Swagger 注解描述 API: 使用 Swagger 注解详细描述 API 的参数、响应、错误码等,提高文档的可读性。
  2. 根据API 分组: 使用 Swagger 的分组功能,将 API 分类展示,方便用户查找。
  3. 添加 API 示例: 在 Swagger注解中添加 API 示例,帮助用户快速了解 API 的使用方法。
  4. 保持 API 文档与代码同步: 确保 API文档和代码同步更新,避免出现文档与代码不一致的问题。
  5. 使用清晰的 API 命名: 使用清晰的 API 命名和参数命名,提高 API的可读性。

相关文章:

Spring Boot 整合 Knife4j:打造更优雅的 API 文档

在现代 Web 应用开发中&#xff0c;API 文档的重要性不言而喻。清晰、准确、易用的 API 文档不仅可以方便开发者理解和使用 API&#xff0c;还能提高团队协作效率。Knife4j 是一个基于 Swagger 的增强型 API 文档工具&#xff0c;它可以为 Spring Boot 项目生成美观、易于交互的…...

Kafka 源码分析(一) 日志段

首先我们的 kafka 的消息本身是存储在日志段中的, 对应的源码是下面这段代码: class LogSegment private[log] (val log: FileRecords,val lazyOffsetIndex: LazyIndex[OffsetIndex],val lazyTimeIndex: LazyIndex[TimeIndex],val txnIndex: TransactionIndex,val baseOffset:…...

javaEE初阶————多线程初阶(2)

今天给大家带来第二期啦&#xff0c;保证给大家讲懂嗷&#xff1b; 1&#xff0c;线程状态 NEW安排了工作还未开始行动RUNNABLE可工作的&#xff0c;或者即将工作&#xff0c;正在工作BLOCKED排队等待WAITING排队等待其他事TIMED_WAITING排队等待其他事TERMINATED工作完成了 …...

Redis学习笔记1【数据类型和常用命令】

Redis学习笔记 基础语法 1.数据类型 String: 最基本的类型&#xff0c;可以存储任何数据&#xff0c;例如文本或数字。示例值为 hello world。Hash: 用于存储键值对&#xff0c;适合存储对象或结构体。示例值为 {"name": "Jack", "age": 21}。…...

JavaWeb项目——查询角色列表到页面中——转发模式

一、知识点 1、req.getRequestDispatch与resp.sendRedirect跳转方式的比较 一、实现原理 1、req.getRequestDispatcher&#xff1a; 属于服务器端跳转&#xff0c;在服务器内部将请求转发给另一个资源&#xff08;如另一个 Servlet 或 JSP 页面&#xff09;。调用 getReques…...

feign调用跳过HTTPS的SSL证书校验配置详解

一、问题抛出 如果不配置跳过SSL证书校验&#xff0c;当Feign客户端尝试连接到一个使用自签名证书的服务器时&#xff0c;可能会抛出类似以下的异常&#xff1a; javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building faile…...

今天也是记录小程序进展的一天(破晓时8)

嗨嗨嗨朋友们&#xff0c;今天又来记录一下小程序的进展啦&#xff01;真是太激动了&#xff0c;项目又迈出了重要的一步&#xff0c;231啦&#xff01;感觉每一步的努力都在积累&#xff0c;功能逐渐完善&#xff0c;离最终上线的目标越来越近了。大家一直支持着这个项目&…...

SQL-leetcode—1084. 销售分析 III

1084. 销售分析 III 表&#xff1a; Product --------------------- | Column Name | Type | --------------------- | product_id | int | | product_name | varchar | | unit_price | int | --------------------- product_id 是该表的主键&#xff08;具有唯一值的列&…...

Linux C\C++编程-文件位置指针与读写文件数据块

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 Linu…...

Flask简介与安装以及实现一个糕点店的简单流程

目录 1. Flask简介 1.1 Flask的核心特点 1.2 Flask的基本结构 1.3 Flask的常见用法 1.3.1 创建Flask应用 1.3.2 路由和视图函数 1.3.3 动态URL参数 1.3.4 使用模板 1.4 Flask的优点 1.5 总结 2. Flask 环境创建 2.1 创建虚拟环境 2.2 激活虚拟环境 1.3 安装Flask…...

【自动化测试】—— Appium使用保姆教程

目录 一. 连接手机 1. 授权 2. 调试 3. 获取参数 二. 启动APP 1. 启动Appium服务 2. 启动Appium Inspector 3. 配置Appium Inspector 三. 功能说明 1. 主菜单功能 2. 快照视图菜单 3. 元素视图菜单 四. 常见问题 1. appPackage有多个设备时 一. 连接手机 1. 授权 首先将手机的开…...

西门子【Library of General Functions (LGF) for SIMATIC S7-1200 / S7-1500】

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 通用函数库 (LGF) 扩展了 TIA Portal 中用于 PLC 编程的 STEP 7 指令&#xff08;数学函数、时间、计数器 等&#xff09;。该库可以不受限制地使用&#xff0c;并包含 FIFO 、搜索功能、矩阵计算、 astro 计…...

IntelliJ IDEA 2023.3 中配置 Spring Boot 项目的热加载

IntelliJ IDEA 2023.3 中配置 Spring Boot 项目的热加载 在 IntelliJ IDEA 2023.3 中配置 Spring Boot 项目的热加载&#xff0c;可以让你在不重启应用的情况下看到代码修改的效果。以下是详细的配置步骤&#xff1a; 添加 spring-boot-devtools 依赖 在 pom.xml 文件中添加 …...

Python----Python高级(正则表达式:语法规则,re库)

一、正则表达式 1.1、概念 正则表达式&#xff0c;又称规则表达式,&#xff08;Regular Expression&#xff0c;在代码中常简写为regex、 regexp或RE&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff0…...

通过Ukey或者OTP动态口令实现windows安全登录

通过 安当SLA&#xff08;System Login Agent&#xff09;实现Windows安全登录认证&#xff0c;是一种基于双因素认证&#xff08;2FA&#xff09;的解决方案&#xff0c;旨在提升 Windows 系统的登录安全性。以下是详细的实现方法和步骤&#xff1a; 1. 安当SLA的核心功能 安…...

Node.js接收文件分片数据并进行合并处理

前言&#xff1a;上一篇文章讲了如何进行文件的分片&#xff1a;Vue3使用多线程处理文件分片任务&#xff0c;那么本篇文章主要看一下后端怎么接收前端上传来的分片并进行合并处理。 目录&#xff1a; 一、文件结构二、主要依赖1. express2. multer3. fs (文件系统模块)4. pat…...

Lsky-Pro在线图片搭建教程(Docker部署方式)

Lsky Pro+ 是一个使用 PHP 语言,采用 Laravel 框架开发的一款 Web 图片管理程序,中文名:兰空图床。如果你需要一个在线图床程序,那么这个开源项目可以帮助到你,部署流程非常简单。本章教程记录如何部署Lsky-Pro。 一、拉取镜像 docker pull halcyonazure/lsky-pro-docke…...

“深入浅出”系列之算法篇:(2)openCV、openMV、openGL

OpenCV是一个的跨平台计算机视觉库,可以运行在Linux囚、Windows 和Mac OS操作系统上。它轻量级而且高效,由一系列 C函数和少量C类构成&#xff0c;同时也提供了Python 接口&#xff0c;实现了图像处理和计算机视觉方面的很多通用算法。 OpenMV是一个开源&#xff0c;低成本&am…...

AI 新动态:技术突破与应用拓展

目录 一.大语言模型的持续进化 二.AI 在医疗领域的深度应用 疾病诊断 药物研发 三.AI 与自动驾驶的新进展 四.AI 助力环境保护 应对气候变化 能源管理 后记 在当下科技迅猛发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;无疑是最具影响力的领域之一。AI 技…...

从CRUD到高级功能:EF Core在.NET Core中全面应用(三)

目录 IQueryable使用 原生SQL使用 实体状态跟踪 全局查询筛选器 并发控制使用 IQueryable使用 在EFCore中IQueryable是一个接口用于表示可查询的集合&#xff0c;它继承自IEnumerable但具有一些关键的区别&#xff0c;使得它在处理数据库查询时非常有用&#xff0c;普通集…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...