从零开始搭建企业管理系统(四):集成 Knife4j

集成 Knife4j

    • 前言
    • Knife4j是什么
    • 集成 Knife4j
      • 引入 pom 依赖
      • 添加基础配置
      • 启动程序测试
      • 完善文档信息
        • 编写配置类
        • 修改 UserController
        • 修改 UserEntity
        • 修改 BaseEntity
      • 文档效果图
        • swagger 界面
        • knife4j 界面

前言

前面一小节我们使用postman来进行接口的调试,如果接口一多,就很不方便进行管理,也不方便调试,所以我们本小节集成一个接口文档组件Knife4j,有疑问可以查看 Knife4j 官网。

Knife4j是什么

Knife4j是一个集Swagger2 和 OpenAPI3 为一体的增强解决方案

Knife4j 是为 Java MVC 框架集成 Swagger 生成 Api 文档的增强解决方案,前身是 swagger-bootstrap-ui,致力于 springfox-swagger 的增强 UI 实现。knife4j 为了契合微服务的架构发展,由于原来 swagger-bootstrap-ui 采用的是后端 Java 代码 + 前端 UI 混合打包的方式,在微服务架构下显的很臃肿,因此项目正式更名为 knife4j,更名后主要专注的方面如下:

  • 后端 Java 代码以及前端 UI 模块进行了分离,在微服务架构下使用更加灵活
  • 提供专注于 Swagger 的增强解决方案,不同于只是单纯增强前端 UI 部分

集成 Knife4j

我们参考 Knife4j 官网的教程进行集成。

因为我们的 Spring Boot 版本是 3.2.0,所以只支持 OpenAPI3 规范

  • Spring Boot 3 只支持OpenAPI3规范
  • Knife4j提供的starter已经引用springdoc-openapi的jar,开发者需注意避免jar包冲突

引入 pom 依赖

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
    <version>4.3.0</version>
</dependency>

添加基础配置

引入之后,其余的配置,开发者即可完全参考springdoc-openapi的项目说明,Knife4j只提供了增强部分,如果要启用Knife4j的增强功能,可以在配置文件中进行开启

官网提供的部分配置如下,我们修改一下相关信息:

# springdoc-openapi项目配置
springdoc:
  swagger-ui:
    # swagger ui 路径
    path: /swagger-ui.html
    # 排序方式 alpha 按字母顺序
    tags-sorter: alpha
    operations-sorter: alpha
  api-docs:
    # 接口文档路径
    path: /v3/api-docs
  group-configs:
    - group: 'sys'
      paths-to-match: '/**'
      packages-to-scan: com.xm.module.sys
# knife4j的增强配置,不需要增强可以不配
knife4j:
  enable: true
  setting:
    language: zh_cn

启动程序测试

配置好了之后,我们就可以启动程序,访问我们刚才配置的路径了,这里有三个路径,我们分别用浏览器访问看看。

1、/swagger-ui.html,这是 swagger-ui 的页面,Springdoc本身也是集成了Swagger3

在这里插入图片描述

2、/v3/api-docs,这就是 Springdoc 的接口接口文档,可以导入到 postman 等工具中。

在这里插入图片描述

3、/doc.html,这是 Knife4j 的默认界面,可以理解为是 swagger-ui 的增强版,展示的内容一样,只是展示的 ui 变了。

在这里插入图片描述

完善文档信息

ok,我们上面只是将 Knife4j 引入到我们的项目中了,但是里面的接口信息还都是默认的,可以通过 swagger-ui 界面看到,有一个 user-controller,下面有多个接口,都是默认的名称,这样我们将文档给别人或前端,理解起来会很困难,所以我们在开发中,是要补全这些信息的,完善一份持续维护的接口文档。

所以,最后一步就是使用 OpenAPI3 的规范注解,注释各个 Spring 的 REST 接口。我们先来看看 swagger2 和 openAPI3 的注解差别。

Spwagger2和OpenApi3注解的对应关系

Swagger 2OpenAPI 3注解位置
@Api@Tag(name = “接口类描述”)Controller 类上
@ApiOperation@Operation(summary = “接口方法描述”)Controller 方法上
@ApiImplicitParams@ParametersController 方法上
@ApiImplicitParam@Parameter(description = “参数描述”)Controller 方法上 @Parameters 里
@ApiParam@Parameter(description = “参数描述”)Controller 方法的参数上
@ApiIgnore@Parameter(hidden = true) 或 @Operation(hidden = true) 或 @Hidden-
@ApiModel@SchemaDTO类上
@ApiModelProperty@SchemaDTO属性上
编写配置类

首先添加一个配置类,配置一些项目相关的信息。

@Configuration
public class SpringDocConfig {

    @Bean
    public OpenAPI openApi() {
        return new OpenAPI().info(
                new Info().title("XM-ADMIN系统接口文档")
                        .version("1.0")
                        .description("一个数据中台项目的接口文档")
                        .termsOfService("http://localhost:9527/")
                        .contact(new Contact().name("xiaoming").url("https://github.com/shixiaomingya"))
                        .license(new License().name("Apache 2.0").url("http://localhost:9527/")));
    }

}
修改 UserController
@Tag(name = "用户管理")
@RestController
@RequestMapping("/sys/user")
public class UserController {

    @Resource
    private UserService userService;

    @GetMapping("/{id}")
    @Operation(summary = "根据用户ID查询用户")
    public UserEntity get(@PathVariable Long id) {
        return userService.get(id);
    }

    @GetMapping("/list")
    @Operation(summary = "查询全部")
    public List<UserEntity> lists() {
        return userService.lists();
    }

    @GetMapping("/page")
    @Operation(summary = "分页查询")
    public Page<UserEntity> page(int page, int size) {
        return userService.page(PageRequest.of(page - 1, size));
    }

    @PostMapping
    @Operation(summary = "新增用户")
    public void save(@RequestBody UserEntity user) {
        userService.save(user);
    }

    @PutMapping
    @Operation(summary = "修改用户")
    public void update(@RequestBody UserEntity user) {
        userService.update(user);
    }

    @DeleteMapping("/{id}")
    @Operation(summary = "根据用户ID删除用户")
    public void delete(@PathVariable Long id) {
        userService.delete(id);
    }
}
修改 UserEntity
@Data
@Entity
@Table(name = "sys_user")
@Schema(description = "用户实体")
public class UserEntity extends BaseEntity implements Serializable {

    /**
     * Id 表示为表 ID
     * GenerationType.IDENTITY 使用自增长主键
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Schema(description = "用户ID")
    private Long id;

    /**
     * REQUIRED 表示用户必填
     */
    @Schema(description = "用户名称", requiredMode = Schema.RequiredMode.REQUIRED)
    private String name;

    @Schema(description = "用户昵称")
    private String nickname;

    @Schema(description = "用户年龄")
    private Integer age;

    @Schema(description = "用户邮箱")
    private String email;

    /**
     * hidden 表示不在文档中显示该字段
     */
    @Schema(description = "用户密码", requiredMode = Schema.RequiredMode.REQUIRED, hidden = true)
    private String password;
}
修改 BaseEntity
@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@Schema(description = "基础实体")
public class BaseEntity {

    @CreatedBy
    @Column(name = "create_user", updatable = false)
    @Schema(description = "创建用户")
    private String createUser;

    @LastModifiedBy
    @Column(name = "update_user")
    @Schema(description = "修改用户")
    private String updateUser;

    @CreatedDate
    @Column(name = "create_time", updatable = false)
    @Schema(description = "创建时间")
    private Date createTime;

    @LastModifiedDate
    @Column(name = "update_time")
    @Schema(description = "修改时间")
    private Date updateTime;
}

文档效果图

swagger 界面

在这里插入图片描述
在这里插入图片描述

knife4j 界面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/235475.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据机器学习算法项目——基于Django/协同过滤算法的房源可视化分析推荐系统的设计与实现

大数据机器学习算法项目——基于Django/协同过滤算法的房源可视化分析推荐系统的设计与实现 技术栈&#xff1a;大数据爬虫/机器学习学习算法/数据分析与挖掘/大数据可视化/Django框架/Mysql数据库 本项目基于 Django框架开发的房屋可视化分析推荐系统。这个系统结合了大数据…

Java项目-瑞吉外卖Day3

填充公共字段&#xff1a; 目的&#xff1a;由于某些属性&#xff0c;例如createdTime这些需要填充的字段会在多个地方出现&#xff0c;所以考虑使用公共字段自动填充的办法减少重复代码。 在对应属性上加入TableField注解。通过fill字段表明策略&#xff0c;是插入/更新的时候…

5个免费AI文案生成器【2024】

随着科技的不断进步&#xff0c;人工智能在各行各业中崭露头角&#xff0c;其中&#xff0c;AI文案生成器的出现在内容创作领域引起了翻天覆地的变化。在这个信息快速传递的时代&#xff0c;如何更高效地进行文案创作成为许多从业者关注的焦点。本文将深入探讨AI文案生成器&…

每日一博 - 图解5种Cache策略

文章目录 概述读策略Cache AsideRead Through 写策略Write ThroughWrite AroundWrite Back 使用场景举例 概述 缓存是在系统中存储数据的临时存储器&#xff0c;用于提高访问速度。缓存策略定义了如何在缓存和主存之间管理数据 读策略 Read data from the system: &#x1f5…

如何从众多知识付费平台中正确选择属于自己的平台(我有才知识付费平台)

在当今的知识付费市场中&#xff0c;用户面临的选择越来越多&#xff0c;如何从众多知识付费平台中正确选择属于自己的平台呢&#xff1f;下面&#xff0c;我们将为您介绍我有才知识付费平台相比同行的优势&#xff0c;帮助您做出明智的选择。 一、创新的技术架构&#xff0c;…

Oracle中LISTAGG 函数 的使用

概念&#xff1a;对于查询中的每个组&#xff0c;LISTAGG 聚合函数根据 ORDER BY 表达式对该组的行进行排序&#xff0c;然后将值串联成一个字符串

一键优化工具,十分不错的win7、win10系统优化的工具,可以帮助用户轻松快速优化系统,供大家学习研究参考~

主要功能 01、禁用索引服务 02、禁止window发送错误报告 03、禁用"最近使用的项目” 04、关闭Windows Defender 05、关闭防火墙 06、检查更新而不自动下载更新 07、启动电源计划“高性能” 08、调整电源选项 09、禁用休眠(删除休眠文件) 10、开启快速启动 11、…

C语言-每日刷题练习

[蓝桥杯 2013 省 B] 翻硬币 题目背景 小明正在玩一个“翻硬币”的游戏。 题目描述 桌上放着排成一排的若干硬币。我们用 * 表示正面&#xff0c;用 o 表示反面&#xff08;是小写字母&#xff0c;不是零&#xff09;&#xff0c;比如可能情形是 **oo***oooo&#xff0c;如果…

【高数:3 无穷小与无穷大】

【高数&#xff1a;3 无穷小与无穷大】 1 无穷小与无穷大2 极限运算法则3 极限存在原则4 趋于无穷小的比较 参考书籍&#xff1a;毕文斌, 毛悦悦. Python漫游数学王国[M]. 北京&#xff1a;清华大学出版社&#xff0c;2022. 1 无穷小与无穷大 无穷大在sympy中用两个字母o表示无…

第 375 场 LeetCode 周赛题解

A 统计已测试设备 模拟&#xff1a;记录当前已测试设备数量 class Solution { public:int countTestedDevices(vector<int> &batteryPercentages) {int res 0;int s 0;for (auto x: batteryPercentages) {if (x - s > 0) {res;s;}}return res;} };B 双模幂运算 …

Course3-Week1-无监督学习

Course3-Week1-无监督学习 文章目录 Course3-Week1-无监督学习1. 欢迎1.1 Course3简介1.2 数学符号约定 2. K-means算法2.1 K-means算法的步骤2.2 代价函数2.3 选择聚类数量 3. 异常检测3.1 异常检测的直观理解3.2 高斯分布3.3 异常检测算法3.4 选取判断阈值 ε \varepsilon ε…

面试操作系统八股文五问五答第一期

面试操作系统八股文五问五答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1.死锁产生的条件 1.互斥条件&#xff0c;即当资源被一个线程使用&#xff08;…

安全高效 江西变电站成功应用国家电网无人机巡检

随着电力需求的迅速增长&#xff0c;电网的巡检、维护与保养变得越来越重要。为迎接这一挑战&#xff0c;江西供电公司的一座变电站成功引入了复亚智能国家电网无人机巡检系统&#xff0c;在提升巡检水平、开创新型巡检模式方面做出了重要尝试&#xff0c;为电网设备的高效巡检…

基于Java SSM框架实现宠物医院信息管理系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现宠物医院信息管理系统演示 java简介 Java语言是在二十世纪末由Sun公司发布的&#xff0c;而且公开源代码&#xff0c;这一优点吸引了许多世界各地优秀的编程爱好者&#xff0c;也使得他们开发出当时一款又一款经典好玩的小游戏。Java语言是纯面向对象语言…

[linux] 用命令行wget下载google drive的大文件

使用wget命令下载Google drive上的文件_ubuntu上wget下载谷歌云盘文件-CSDN博客 如何用命令行下载Google Drive上的共享文件&#xff1f;-腾讯云开发者社区-腾讯云 举例&#xff1a;https://drive.google.com/drive/folders/1vKj3VvJEKgS_o-uOSmz3I0-GomECpql3 1、在网页上&…

基于JavaWeb的物业管理系统运行部署教程

基于JavaWeb的物业管理系统 一、下载源码二、数据准备三、项目导入idea四、配置Tomcat五、修改数据库密码&运行项目六、测试项目七、问题修复 一、下载源码 源码地址&#xff1a;基于JavaWeb的物业管理系统源码 得到一个压缩包&#xff1a; 解压之后&#xff1a; 删除多…

基于SpringBoot+Vue社区医院服务系统(Java毕业设计)

点击咨询源码 大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的…

自适应中值滤波器的python代码实现-----冈萨雷斯数字图像处理

基本原理&#xff1a; 自适应中值滤波器是一种图像处理技术&#xff0c;用于去除图像中的噪声。其原理是根据像素周围邻域内像素值的特性&#xff0c;动态地选择滤波器的大小和中值滤波的程度。 **邻域选择&#xff1a;**对于每个像素点&#xff0c;选取一个窗口或者邻域&…

【数组Array】力扣-167 两数之和II-输入有序数组

目录 题目描述 解题过程 labuladong题解 题目描述 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &a…

归并排序与自然归并排序

归并排序 归并排序(merge - sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用.将已有的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序.若将两个有序表合并成一个有序表,成为二路归并. 核心步骤讲解 归并排序的…