当前位置: 首页 > 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…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...