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

Springboot 3项目整合Knife4j接口文档(接口分组详细教程)

文章目录
  • 前言
  • 一、Spring Boot 3.0整合Knife4j
  • 二、OpenApi 3注解的使用规范
  • 三、使用步骤
    • 1.Spring Boot 3.0项目中使用knife4j
    • 2.在application.yml中添加knife4j相关配置
    • 3.设置WebMvc相关配置(解决封装统一异常处理后doc.html无法打开的问题)
    • 4.创建Knife4j的配置文件
    • 5.添加实体类信息
    • 6.在controller下新建security和system文件夹,添加相应接口进行测试
  • 四、重启项目并访问接口文档
  • 五、Springboot启动类优化

前言

springboot 3开始javax包改成了jakarta,而swagger-oas等包中依然使用的是javax,所以报错。另外springfox已经停止更新有段时间了,并且不支持OpenAPI 3标准,升级Springboot 3.0以后会有更多问题暴露出来。而SpringBoot 3只支持OpenAPI 3规范,因此Spring官网推荐了Springdoc

OpenApi 3的规范,目前针对Java的Spring Boot项目,主要支持的有2个版本:

  • springfox 3.0.0: 同时兼容OpenAPI 2以及OpenAPI 3,但是停更很久了
  • springdoc-openapi:兼容OpenAPI 3规范,更新速度频繁
  • Knife4j:在只有的OpenAPI 3规范中,底层基础框架选择springdoc-openapi项目,针对Springfox 3.0.0版本会放弃

一、Spring Boot 3.0整合Knife4j

以下是一些常见的Spring Boot版本及其对应的Knife4j版本兼容推荐:

Spring Boot版本

Knife4j Swagger 2规范

Knife4j OpenAPI 3规范

1.5.x ~ 2.0.0

< Knife4j 2.0.0

>= Knife4j 4.0.0

2.0 ~ 2.2

Knife4j 2.0.0 ~ 2.0.6

>= Knife4j 4.0.0

2.2.x ~ 2.4.0

Knife4j 2.0.6 ~ 2.0.9

>= Knife4j 4.0.0

2.4.0 ~ 2.7.x

>= Knife4j 4.0.0

>= Knife4j 4.0.0

>= 3.0

>= Knife4j 4.0.0

>= Knife4j 4.0.0

参考文档:关于Knife4j适配不同Spring Boot版本的说明文档

项目配置:

JDK:23

SpringBoot:3.3.1

Knife4j:4.5.0

温馨提示:

在这里插入图片描述


二、OpenApi 3注解的使用规范

  • Swagger 3(OpenApi 3) 注解与Swagger 2注解的对比

Swagger 2

OpenAPI 3

注解位置

作用

@Api

@Tag(name = “接口类名”,description = “接口类描述”)

Controller类

描述此controller的信息

@ApiOperation(value = “接口方法描述”)

@Operation(summary =“接口方法描述”)

Api端口方法

描述此Api的信息

@ApiImplicitParams

@Parameters

Api端口方法

描述参数信息

@ApiImplicitParam

@Parameter(description=“参数描述”)

Api方法的参数

描述参数信息

@ApiParam

@Parameter(description=“参数描述”)

Api方法的参数

-

@ApiIgnore

@Parameter(hidden = true) 或 @Operation(hidden = true) 或 @Hidden

-

用在各种地方,用于隐藏其Api

@ApiModel

@Schema

DTO类

用于Entity,以及Entity的属性上

@ApiModelProperty

@Schema

DTO属性

用于Entity,以及Entity的属性上

参考链接: 从 Springfox Swagger 2 迁移到 Springdoc Open API


三、使用步骤

1.Spring Boot 3.0项目中使用knife4j

  • 在pom.xml文件中导入knife4j的依赖(本文springboot的版本是3.3.1)

    com.github.xiaoymin knife4j-openapi3-jakarta-spring-boot-starter 4.5.0

其实现在就可以使用Knife4j了,暂不做其他配置,启动项目,浏览器输入http://localhost:8080/doc.html查看接口文档

  • 由于我们没有进行任何的属性配置,所以看到的页面是knife4j的初始页面

在这里插入图片描述

2.在application.yml中添加knife4j相关配置

# knife4j的增强配置,不需要增强可以不配
knife4j:enable: true    # 开启knife4j,无需添加@EnableKnife4j注解setting:language: zh_cn   #中文swagger-model-name: 实体列表   #默认为: Swagger Modelsbasic: # 开启Swagger的Basic认证功能,默认是falseenable: trueusername: adminpassword: 123456

3.设置WebMvc相关配置(解决封装统一异常处理后doc.html无法打开的问题)

  • 定义一个编码格式常量类,里面存储静态资源地址(封装起来便于使用和维护)

    package com.patrick.blog.constant;

    /**

    • 编码格式常量类

    • @author Patrick

    • @since 2025-1-1
      */
      public class SystemConstant {

      /**

      • Knife4j接口文档接口分组和分组路径
        */
        public static class Knife4j {

        /**

        • 接口分组
          */
          public static final String SECURITY = “权限管理”;
          public static final String SYSTEM = “系统管理”;

        /**

        • 接口分组路径
          */
          public static final String SECURITY_PATH = “com.patrick.blog.controller.security”;
          public static final String SYSTEM_PATH = “com.patrick.blog.controller.system”;
          }

      /**

      • 编码常量
        */
        public static class Charset {

        /**

        • 编码格式设置
          */
          public static final String JSON_TYPE_UTF8_CHARSET = “application/json;charset=UTF-8”;

      }

       /*** 允许匿名访问的静态资源路径列表*/public static final String[] STATIC_WITHE_PATH_LIST = new String[]{"/","/js/**","/css/**","/img/**","/fonts/**","/index.html","/favicon.ico","/doc.html","/swagger-ui.html","/webjars/**","/swagger-resources/**","/v3/**"};/*** 允许匿名访问的静态资源存放位置列表*/public static final String[] STATIC_WITHE_LOCATION_LIST = new String[]{"classpath:/static/","classpath:/public/","classpath:/META-INF/resources/"};
      

      }

    }

  • 定义系统配置类WebMvcConfig,由于knife4j接口文档属于静态资源,需将相关资源放行

    package com.patrick.blog.config;

    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

    import static com.patrick.blog.constant.SystemConstant.Permission.*;

    /**

    • 设置WebMvc相关配置

    • @author Patrick

    • @since 2025-1-1
      */
      @Configuration
      public class WebMvcConfig implements WebMvcConfigurer {

      /**

      • 解决resources下的静态资源无法访问

      • @param registry 资源映射注册器
        */
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {

        // 静态资源映射
        registry.addResourceHandler(STATIC_WITHE_PATH_LIST)
        .addResourceLocations(STATIC_WITHE_LOCATION_LIST)
        .setCachePeriod(0);
        }

    }

4.创建Knife4j的配置文件

  • 该文件主要进行Knife4j的属性配置,如:标题、版本、作者信息、接口分组等

    package com.patrick.blog.config;

    import io.swagger.v3.oas.models.info.Contact;
    import io.swagger.v3.oas.models.info.Info;
    import io.swagger.v3.oas.models.info.License;
    import org.springdoc.core.models.GroupedOpenApi;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;

    import static com.patrick.blog.constant.SystemConstant.Knife4j.*;

    /**

    • Knife4j配置类

    • @author Patrick

    • @since 2025-1-1
      */
      @Configuration
      public class Knife4jConfig {

      /**

      • 创建权限分组api

      */
      @Bean
      public GroupedOpenApi securityApi() {
      return createRestApi(SECURITY, SECURITY_PATH);
      }

      /**

      • 创建系统分组api

      */
      @Bean
      public GroupedOpenApi systemApi() {
      return createRestApi(SYSTEM, SYSTEM_PATH);
      }

      /**

      • 创建api
      • @param groupName 分组名称
      • @param basePackage 包路径
      • @return GroupedOpenApi
        */
        public GroupedOpenApi createRestApi(String groupName, String basePackage) {
        return GroupedOpenApi.builder()
        .group(groupName) // 分组名称
        .packagesToScan(basePackage) // 扫描的包路径
        .pathsToMatch(“/**”) // 匹配所有路径
        .addOpenApiCustomizer(openApi -> openApi.info(apiInfo())) // 设置api信息
        .build();
        }

      /**

      • api简介信息
      • @return ApiInfo
        */
        private Info apiInfo() {
        return new Info()
        .title(“Patrick后台管理系统服务接口”) // 标题
        .description(“Patrick后台管理系统服务接口文档…”) // 描述
        .version(“1.0.0”) // 版本号
        .termsOfService(“http://doc.xiaominfo.com”) // 服务条款
        .contact(new Contact().name(“Patrick”).url(“https://github.com/Patrick-Luo-THR”).email(“patrick.luo@163.com”)) // 联系人信息
        .license(new License().name(“Apache 2.0”).url(“http://www.apache.org/licenses/LICENSE-2.0.html”)); // 许可证信息
        }

    }

5.添加实体类信息

@Schema(description = “ ”): 标记实体类属性

@Data
@TableName("t_user")
@Schema(description = "用户实体")
public class User implements Serializable {@Schema(description = "用户id")private Integer id;@Schema(description = "用户昵称")private String nickname;@Schema(description = "用户名")private String username;@Schema(description = "用户密码")private String password;}

6.在controller下新建security和system文件夹,添加相应接口进行测试

@Tag(name = “ ”): 标记接口类别
@Operation(summary =“ ”): 标记接口操作

  • 创建(create) – 使用Post方法;

  • 修改(update) – 使用Post方法;

  • 删除(delete) – 使用Delete方法;

    @RestController
    @Tag(name = “用户管理”)
    @RequestMapping(“/user”)
    public class UserController {

    @Autowired
    UserService userService;/*** 用户列表* @return*/
    @Operation(summary = "用户列表")
    @GetMapping("/list")
    public JsonResult list() {List<User> userList = userService.findAll();return JsonResult.success().data("userList", userList);
    }
    

    }


四、重启项目并访问接口文档

  • 访问http://localhost:8080/doc.html,可以看到我们配置的属性已经在页面中显示出来了

在这里插入图片描述


五、Springboot启动类优化

  • 每次都需要打开浏览器输入地址访问,对开发者很不友好,因此采取以下优化

    @Slf4j
    @SpringBootApplication
    public class BlogApplication {

    public static void main(String[] args) {ConfigurableEnvironment env = SpringApplication.run(BlogApplication.class, args).getEnvironment();log.info("
    

    " +"Application: '{}' is running Success! 
    " +"Local URL: 	http://localhost:{}
    " +"Document:	http://localhost:{}/doc.html
    

    " +
    “----------------------------------------------------------”,
    env.getProperty(“spring.application.name”),
    env.getProperty(“server.port”),
    env.getProperty(“server.port”));
    }

    }

  • 项目启动,控制台打印日志如下:

在这里插入图片描述

相关文章:

Springboot 3项目整合Knife4j接口文档(接口分组详细教程)

文章目录 前言一、Spring Boot 3.0整合Knife4j二、OpenApi 3注解的使用规范三、使用步骤 1.Spring Boot 3.0项目中使用knife4j2.在application.yml中添加knife4j相关配置3.设置WebMvc相关配置&#xff08;解决封装统一异常处理后doc.html无法打开的问题&#xff09;4.创建Knif…...

深入解析 Conda 安装的默认依赖包及其作用:conda create安装了哪些包(中英双语)

深入解析 Conda 安装的默认依赖包及其作用 当我们使用 Conda 创建新环境时&#xff0c;例如执行命令&#xff1a; conda create -n olmes python3.10Conda 会自动为我们安装一系列基础依赖包&#xff0c;保证 Python 环境能够正常运行。这些包不仅是我们开发的基础工具&#…...

Redis核心技术知识点全集

Redis数据结构和常用命令 1. String字符串2. Hash哈希3. List列表4. Set集合5. Sorted Set有序集合6. Redis常用命令参考Redis事务机制...

【Unity3D】ECS入门学习(九)SystemBase

SystemBase&#xff1a;支持主线程或多线程执行筛选实体任务。 主要介绍是内部成员&#xff1a;Entities的各种筛选方法&#xff0c;其内部成员还有EntityManager ForEach方法筛选&#xff0c;传递一个有参委托函数进去&#xff0c;参数ref xxx组件类&#xff08;可填多个&…...

【Triton-ONNX】如何使用 ONNX 模型服务与 Triton 通信执行推理任务上-Triton快速开始

模型部署系列文章 前置-docker 理解:【 0 基础 Docker 极速入门】镜像、容器、常用命令总结前置-http/gRPC 的理解: 【HTTP和gRPC的区别】协议类型/传输效率 /性能等对比【保姆级教程附代码】Pytorch (.pth) 到 TensorRT (.plan) 模型转化全流程【保姆级教程附代码(二)】Pytor…...

CertiK《Hack3d:2024年度安全报告》(附报告全文链接)

CertiK《Hack3d&#xff1a;2024年度安全报告》现已发布&#xff0c;本次报告深入分析了2024年Web3.0领域的安全状况。2024年损失总额超过23亿美元&#xff0c;同比增幅高达31.61%&#xff1b;其中&#xff0c;12月的损失金额最少。过去一年&#xff0c;网络钓鱼攻击和私钥泄露…...

TIOBE 指数 12 月排行榜公布,VB.Net排行第九

IT之家 12 月 10 日消息&#xff0c;TIOBE 编程社区指数是一个衡量编程语言受欢迎程度的指标&#xff0c;评判的依据来自世界范围内的工程师、课程、供应商及搜索引擎&#xff0c;今天 TIOBE 官网公布了 2024 年 12 月的编程语言排行榜&#xff0c;IT之家整理如下&#xff1a; …...

【网络协议】开放式最短路径优先协议OSPF详解(一)

OSPF 是为取代 RIP 而开发的一种无类别的链路状态路由协议&#xff0c;它通过使用区域划分以实现更好的可扩展性。 文章目录 链路状态路由协议OSPF 的工作原理OSPF 数据包类型Dijkstra算法、管理距离与度量值OSPF的管理距离OSPF的度量值 链路状态路由协议的优势拓扑结构路由器O…...

嵌入式Linux驱动开发的基本知识(驱动程序的本质、常见的设备类型、设备号的本质理解、设备实例的注册过程)

基本概念之什么是驱动程序()&#xff1f; 驱动程序本质上是代码逻辑的集合&#xff0c;通常用于管理、驱动多个设备实例。某个设备要想使用驱动程序&#xff0c;需要实例化相应的驱动程序的结构体&#xff0c;并在系统中注册&#xff0c;获得主设备号、次设备号&#xff0c;并…...

爱死机第四季(秘密关卡)4KHDR国语字幕

通过网盘分享的文件&#xff1a;love_death_robot 链接: https://pan.baidu.com/s/1bG3Xtdopenil2O_y93hY_g?pwd8kib 提取码: 8kib...

kubelet状态错误报错

journalctl -xeu kubelet 执行后的日志如下: -- -- The process exit code is exited and its exit status is 1. Jan 02 14:20:06 iv-ydipyqxfr4wuxjsij0bd systemd[1]: kubelet.service: Failed with result exit-code. -- Subject: Unit failed -- Defined-By: system…...

<div>{{ $t(“collectionPlan“) }}</div> 中的$t是什么

$t是Vue I18n插件提供的一种方法&#xff0c;用于根据当前应用的语言环境来获取相应的翻译文本。 以下是一个简单的示例&#xff0c;展示如何在Vue I18n中定义消息&#xff1a; const i18n new VueI18n({locale: en, // 设置默认语言messages: {en: {collectionPlan: Collec…...

[C++刷题] 求回文素数

求回文素数 题目 素数回文数的个数 题目描述 求 11 11 11 到 n n n 之间&#xff08;包括 n n n&#xff09;&#xff0c;既是素数又是回文数的整数有多少个。 输入格式 一个大于 11 11 11 小于 10000 10000 10000 的整数 n n n。 输出格式 11 11 11 到 n n n 之…...

SQLALchemy如何将SQL语句编译为特定数据库方言

最近在一个使用fastapitortoise-orm的项目中&#xff0c;需要将orm的语句编译成特定数据库方言&#xff0c;但是查询了官方文档及一些资料却找不到合适的方法论&#x1f614;&#xff0c;于是乎我就把目光放到了sqlalchemy身上&#xff0c;东找西找给我找着了。话不多说&#x…...

[卫星遥感] 解密卫星目标跟踪:挑战与突破的深度剖析

目录 [卫星遥感] 解密卫星目标跟踪&#xff1a;挑战与突破的深度剖析 1. 卫星目标跟踪的核心挑战 1.1 目标的高速与不确定性 1.2 卫星传感器的局限性 1.3 数据处理与融合问题 1.4 大尺度与实时性要求 2. 当前卫星目标跟踪的主流技术 2.1 卡尔曼滤波&#xff08;Kalman …...

I2C(一):存储器模式:stm32作为主机对AT24C02写读数据

存储器模式&#xff1a;在HAL库中&#xff0c;I2C有专门对存储器外设设置的库函数 I2C&#xff08;一&#xff09;&#xff1a;存储器模式的使用 1、I2C轮询式写读AT24C02一页数据2、I2C轮询式写读AT24C02多页数据3、I2C中断式写读AT24C02一页数据4、I2C使用DMA式写读AT24C02一…...

scrapy 教程

Scrapy Tutorial In this tutorial, we’ll assume that Scrapy is already installed on your system. If that’s not the case, see Installation guide. We are going to scrape quotes.toscrape.com, a website that lists quotes from famous authors. This tutorial …...

2025元旦源码免费送

我们常常在当下感到时间慢&#xff0c;觉得未来遥远&#xff0c;但一旦回头看&#xff0c;时间已经悄然流逝。对于未来&#xff0c;尽管如此&#xff0c;也应该保持一种从容的态度&#xff0c;相信未来仍有许多可能性等待着我们。 免费获取源码。 更多内容敬请期待。如有需要可…...

高级架构五 设计模式

一 设计模式七大原则 1.1. 设计模式目的 编写软件过程中&#xff0c;程序员面临着来自 耦合性&#xff0c;内聚性以及可维护性&#xff0c;可扩展性&#xff0c;重用性&#xff0c;灵活性 等多方面的挑战&#xff0c;设计模式是为了让程序(软件)&#xff0c;具有更好的&#…...

RFID手持机与RFID工业平板在仓储物流管理系统中的选型

概述 随着物联网技术在仓储物流管理系统中的普及&#xff0c;RFID手持机与RFID工业平板作为基于RFID技术手持式读写器的两种重要终端设备形态&#xff0c;得到了广泛应用。尽管RFID手持机与RFID工业平板都具备读写 RFID标签的基本功能&#xff0c;使用场景较为类似&#xff0c…...

突破限制与全版本支持:MediaCreationTool.bat重新定义Windows安装介质制作

突破限制与全版本支持&#xff1a;MediaCreationTool.bat重新定义Windows安装介质制作 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreatio…...

ai辅助开发:借助快马ai模型为直播应用添加弹幕情感分析与摘要生成功能

最近在开发一个直播应用时&#xff0c;发现弹幕互动是直播体验的重要组成部分&#xff0c;但海量弹幕中往往隐藏着观众的真实反馈和直播亮点。于是尝试用AI技术来增强直播应用的智能化功能&#xff0c;这里分享一下如何快速实现一个弹幕情感分析与摘要生成的工具页面。 项目构思…...

用STM32CubeMX和TMC260驱动步进电机,这份PWM频率配置指南帮你避开新手常见坑

STM32CubeMX与TMC260步进电机驱动实战&#xff1a;PWM频率配置的黄金法则 第一次用STM32CubeMX配置TMC260驱动步进电机时&#xff0c;我盯着屏幕上那一堆定时器参数发愣——Prescaler、Period、Counter Mode...这些看似简单的数字背后&#xff0c;藏着让电机平稳运转或是疯狂抖…...

ENVI实战:利用传感器波谱响应函数实现光谱曲线精准重采样

1. 为什么需要光谱重采样&#xff1f; 在遥感数据分析中&#xff0c;我们经常会遇到一个头疼的问题&#xff1a;不同传感器采集的光谱数据分辨率不一致。比如实验室用光谱仪测量的叶片反射率可能有上千个波段&#xff0c;而Landsat-8卫星只能获取11个波段的数据。这就好比用高清…...

第21课:把 Qt 常用能力串成实战链路,打通文本、绘图、线程、网络与多媒体

本节路线图 为什么这节课看起来很散, → 先把程序的输入输出拿下: → 让界面真正活起来:`QP 兔兔建议 先顺着路线图跑一遍,再抄命令和代码,学习体验会轻松很多。 前两课我们已经把 Qt 的“界面底座”搭起来了,但真正做项目时,很多同学还是会卡在另一个问题上:界面会做了…...

文墨共鸣大模型与Matlab科学计算结合:数据报告自动化

文墨共鸣大模型与Matlab科学计算结合&#xff1a;数据报告自动化 每次做完仿真和数据分析&#xff0c;看着满屏的图表和密密麻麻的数据矩阵&#xff0c;你是不是也头疼怎么写报告&#xff1f;从数据到文字&#xff0c;这中间仿佛隔着一道鸿沟&#xff0c;既要组织语言&#xf…...

MiniCPM-o-4.5-nvidia-FlagOS开源镜像:FlagOS软件栈赋能的NVIDIA GPU原生推理方案

MiniCPM-o-4.5-nvidia-FlagOS开源镜像&#xff1a;FlagOS软件栈赋能的NVIDIA GPU原生推理方案 想快速体验一个能看懂图片、还能跟你聊天的AI助手吗&#xff1f;今天要介绍的MiniCPM-o-4.5-nvidia-FlagOS开源镜像&#xff0c;就是一个开箱即用的多模态AI解决方案。它基于FlagOS…...

Beyond Compare许可证获取与激活全攻略

1. Beyond Compare简介与许可证类型解析 Beyond Compare作为一款老牌文件对比工具&#xff0c;已经陪伴开发者走过了20多个年头。我第一次接触它是在2015年做代码合并时&#xff0c;当时就被它直观的三栏式对比界面惊艳到了——左右两侧显示对比内容&#xff0c;中间实时标注差…...

Windows 11 上安装 MinGW-w64 并运行 LVGL SDL 模拟器

目前最推荐的方式是使用 MSYS2。它安装简单、包管理方便&#xff08;pacman&#xff09;&#xff0c;而且能直接安装 SDL2&#xff0c;避免手动复制头文件和库的麻烦。 以下是完整、推荐的步骤&#xff08;2026 年最新实践&#xff09;&#xff1a; 1. 安装 MSYS2&#xff08…...

【JupyterLab实战】构建跨平台AI算力监控仪表盘

1. 为什么需要跨平台AI算力监控&#xff1f; 在AI开发过程中&#xff0c;我们经常遇到这样的场景&#xff1a;模型训练到一半突然卡死&#xff0c;却不知道是GPU内存爆了还是CPU瓶颈&#xff1b;多卡并行时某张卡莫名其妙跑不满&#xff1b;昇腾芯片的温度报警频繁触发却找不到…...