基于SpringBoot3从零配置SpringDoc

news2024/11/23 15:46:42

为了方便调试,更好的服务于前后端分离式的工作模式,我们给项目引入Swagger。

文章目录

  • 1. SpringFox
  • 2. SpringDoc
    • 2.1 引入依赖
    • 2.2 配置文件
    • 2.3 语法
    • 2.4 使用示例
      • @Tag 用于标识controller
      • @Operation 用于标识方法
      • @Schema 用于标识实体类和实体类的属性
      • @ApiResponse 用于标识请求的响应
      • @Parameters和@Parameter 用于标识请求参数
    • 2.5 使用自带的swagger-ui查看:
  • 3. 引入Knife4j
    • 3.1 引入依赖
    • 3.2 xml配置
    • 3.3 展示
  • 4. 文档分组

1. SpringFox

首先想到的肯定是SpringFox
pom1
引入之后项目启动报错:
java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest not present
err1

  1. github SpringFox已经两年没有更新了。
  2. SpringFox对SpringBoot3.0不适配,要使用必须降低SpringBoot版本,这显然不是我们的风格
    果断弃用。

2. SpringDoc

更新很快,且支持OpenAPI 3、SpringBoot 3。

切换到SpringDoc后有两点不太舒服:

  1. 之前使用SpringFox较多,注解一下全换成SpringDoc风格的不太习惯
  2. MybatisPlus代码机生成实体类暂不支持SpringDoc注解,生成后需要手动添加(随着表的增多和表结构的复杂化,这部分工作量是很大的),希望苞米豆大大们支持一下。

2.1 引入依赖

        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
            <version>2.1.0</version>
        </dependency>

2.2 配置文件

@Configuration
public class YaSwaggerConfig {

    private License license() {
        return new License()
                .name("MIT")
                .url("https://opensource.org/licenses/MIT");
    }

    private Info info(){
        return new Info()
                .title("Ya API")
                .description("A test project for Mr.Ya.")
                .version("v1.0.0")
                .license(license());
    }
    private ExternalDocumentation externalDocumentation() {
        return new ExternalDocumentation()
                .description("这是一个额外的描述。")
                .url("https://shijizhe.github.io/");
    }

    @Bean
    public OpenAPI springShopOpenAPI() {
        return new OpenAPI()
                .info(info())
                .externalDocs(externalDocumentation());
    }
}

2.3 语法

SpringFoxSpringDoc
@Api@Tag
@ApiOperation(value = “foo”, notes = “bar”)@Operation(summary = “foo”, description = “bar”)
@ApiParam@Parameter
@ApiResponse(code = 404, message = “foo”)@ApiResponse(responseCode = “404”, description = “foo”)
@ApiModel@Schema
@ApiModelProperty@Schema
@ApiIgnore@Parameter(hidden = true)or@Operation(hidden = true)or@Hidden
@ApiImplicitParam@Parameter
@ApiImplicitParams@Parameters

2.4 使用示例

一些使用示例:

@Tag 用于标识controller

@Tag(name = "FruitController", description = "水果相关接口")
@Slf4j
@RestController
@RequestMapping("/goods/fruit")
public class FruitController {
}

@Operation 用于标识方法

    @PutMapping("/update")
    @Operation(summary = "update", description = "更新水果信息")
    @Parameter(name = "fruit",description = "需要更新的水果")
    public Object update(Fruit fruit) {
        return fruitService.updateById(fruit);
    }

@Schema 用于标识实体类和实体类的属性

@Schema(description = "水果")
public class Fruit implements Serializable {
    private static final long serialVersionUID = 1L;

    @Schema(description = "主键")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    @Schema(description = "编码")
    private String frCode;
    
    @Schema(description = "名称")
    private String frName;

    @Schema(description = "价格")
    private BigDecimal frPrice;
}

@ApiResponse 用于标识请求的响应

    @GetMapping("/list2")
    @Operation(summary  = "list2", description = "列表查询2")
    @ApiResponse(description = "列表查询用户返回",content = {
            @Content(
                    array= @ArraySchema(schema = @Schema(implementation = YaUser.class))
            )
    })
    public Object list2() {
        // 使用mybatis-plus
        return  yaUserService.list();
    }

@Parameters和@Parameter 用于标识请求参数

@Parameter的name需要和变量的命名一致

    @PutMapping("/update2")
    @Operation(summary = "update2", description = "更新水果信息2")
    @Parameters({
            @Parameter(name = "code",description = "水果编码"),
            @Parameter(name = "name",description = "水果名称"),
            @Parameter(name = "price",description = "水果价格")
    })
    public Object update2( String code, String name, Integer price) {
        UpdateWrapper<Fruit> wrapper = new UpdateWrapper<>();
        wrapper.lambda()
                .eq(Fruit::getFrCode,code)
                .set(Fruit::getFrName,name)
                .set(Fruit::getFrPrice,price);
        return fruitService.update(wrapper);
    }

@Parameter 放到函数形参前面

    @GetMapping("/hello")
    @Operation(summary  = "hello", description = "hello")
    public Object hello(@Parameter(description = "需要打招呼的人",example="xiaoming") String userName) {
        return "hello" + userName;
    }

2.5 使用自带的swagger-ui查看:

http://localhost:8080/swagger-ui/index.html#/
swagger

3. 引入Knife4j

引入Knife4j优化Swagger样式:

3.1 引入依赖

Knife4j提供的starter已经引用springdoc-openapi的jar,应该将SpringDoc的依赖注释掉


<!--       
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
            <version>2.1.0</version>
        </dependency>-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
            <version>4.1.0</version>
        </dependency>

3.2 xml配置

直接使用官网提供的示例即可:

springdoc:
  swagger-ui:
    path: /swagger-ui.html
    tags-sorter: alpha
    operations-sorter: alpha
  api-docs:
    path: /v3/api-docs
  group-configs:
    - group: 'default'
      paths-to-match: '/**'
      packages-to-scan: com.ya.boottest

knife4j:
  enable: true
  setting:
    language: zh_cn

3.3 展示

确实比swagger-ui好用和美观!
在这里插入图片描述

4. 文档分组

  group-configs:
    - group: 'default'
      paths-to-match: '/**'
      packages-to-scan: com.ya.boottest
    - group: 'common'
      paths-to-match: '/common/**'
      packages-to-scan: com.ya.boottest
    - group: 'goods'
      paths-to-match: '/goods/**'
      packages-to-scan: com.ya.boottest

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity Nsight Graphcis 使用

前言 在渲染Profile中&#xff0c;大家经常喜欢使用Renderdoc软件, 之前我的一篇博客也介绍Renderdoc Profile渲染的流程 RenderDoc Debug UE4 Shader_ue4 debug shader_带帯大师兄的博客-CSDN博客 Renderdoc适合查看Draw哪一步出差了&#xff0c;导致效果不符合理想&#xf…

webpack : 无法加载文件 D:\...\node-v18.16.0-win-x64\webpack.ps1,因为在此系统上禁止运行脚本

用idea打开项目时&#xff0c;安装webpack打包的包之后&#xff0c;由于组策略问题拒绝执行脚本 解决方法 1、cmd打开命令行。输入&#xff1a;powershell 出现 PS 证明已经进入组策略模式 2、输入&#xff1a;get-executionpolicy&#xff0c;查看策略 ​ 输入&#xff1a…

浅谈线程池

浅谈线程池 1、线程池 1.1、线程池介绍 线程池是一种多线程处理形式&#xff0c;处理过程中将任务添加到队列&#xff0c;然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小&#xff0c;以默认的优先级运行&#xff0c;并处于多线程…

Golang每日一练(leetDay0057) 缺失区间、最大间距

目录 163. 缺失的区间 Missing Ranges &#x1f31f;&#x1f31f; 164. 最大间距 Maximum Gap &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

空闲任务与阻塞延时(笔记)

目录 前言 空闲任务实现空闲任务1、定义空闲任务栈2、定义空闲任务的任务控制块4、定义空闲任务主体 实现阻塞延时vTaskDelay()函数任务与空闲任务切换的例子&#xff1a;vTaskSwitchContext()函数SysTick中断服务函数更新系统时基 SysTick初始化函数实验仿真 前言 软件延时是…

牛客网专项练习Pytnon分析库(二)

1.Z-score标准化公式&#xff0c;,中的σ表示的是什么&#xff08;C&#xff09;。 A.总体平均值 B.数据的方差 C.数据的标准差 D.数据的众数 解析&#xff1a; Z-score标准化也叫标准差标准化法&#xff0c;其中X表示数据样本值&#xff0c;μ表示数据样本的平均值&#x…

婚姻的本质,不是爱情

婚姻的本质&#xff0c;不是爱情 结婚是为了爱情么&#xff1f;普通人或许以为是&#xff0c;但实际并不是。如果你是为了爱情&#xff0c;那你不需要结婚。什么叫爱情。所谓爱情&#xff0c;就是你对她朝思暮想&#xff0c;时时刻刻都想和她在一起。而她也对你朝思暮想&#…

Vue学习笔记1 - Vue是什么?

1&#xff0c;Vue概念 官网上&#xff08;简介 | Vue.js&#xff09; 上说&#xff0c; Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。 这个还好理解&#xff0c;就是说它是一款前端框架&#xff0c;用于构建 前端界面的。 但是它…

NewBing 还无法访问的几个问题

大部分的AI自媒体都在说&#xff0c;Bing new已经向全世界开放了&#xff0c;我也凑一下这个热闹&#xff0c;用Edge浏览器打开&#xff0c;访问https://www.bing.com/new?ccus 想体验一下Bing new的效果&#xff0c;结果如下&#xff1a; 相信很多人都碰到了这个问题 此体验…

Windows上使用CLion配置OpenCV环境,CMake下载,OpenCV的编译,亲测可用的方法(一)

一、Windows上使用CLion配置OpenCV环境,亲测可用的方法: Windows上使用CLion配置OpenCV环境 教程里的配置: widnows 10 clion 2022.1.1 mingw 8.1.0 opencv 4.5.5 Cmake3.21.1 我自己的配置: widnows 10 clion 2022.2.5 mingw 8.1.0 https://sourceforge.net/projects/min…

二十三种设计模式第三篇--抽象工厂模式

介绍 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是围绕一个超级工厂创建其他工厂&#xff0c;该超级工厂又称为其他工厂的工厂。 这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 在抽象工厂模式中&#xff0c;接口是负责…

对标世界一流|亚马逊供应链管理经验借鉴

当前电商零售行业竞争日趋激烈&#xff0c;服务标准的提升、产品价格的竞争力等因素&#xff0c;导致企业经营成本持续上升&#xff0c;供应链的管理水平已经成为零售行业成败的关键。然而在电商零售行业的红海竞争中&#xff0c;亚马逊却始终保持着高速增长的态势&#xff0c;…

港联证券|4连板的AI+传媒概念股火了,近5亿资金抢筹

今天&#xff0c;沪深两市共51股涨停&#xff0c;除掉10只ST股&#xff0c;合计41股涨停。别的&#xff0c;11股封板未遂&#xff0c;全体封板率为81%。 涨停战场&#xff1a;长江传媒封单量最高 从收盘涨停板封单量来看&#xff0c;长江传媒封单量最高&#xff0c;有39.96万手…

STL初识

什么是STL? 菜鸟教程的解释是&#xff1a;C STL&#xff08;标准模板库&#xff09;是一套功能强大的 C 模板类&#xff0c;提供了通用的模板类和函数&#xff0c;这些模板类和函数可以实现多种流行和常用的算法和数据结构&#xff0c;如向量、链表、队列、栈。 也就是说&am…

4.1 数据结构引入

目录 什么是数据结构 语言出生顺序 基本概念 数据的逻辑结构 数据的存储结构 顺序储存 链式存储 索引存储 散列存储 基本概念 第一卷《基本算法》 第二卷《半数字化算法》 第三卷《排序与搜索》 第四卷《组合算法》 什么是数据结构 数据结构研究计算机数据间关系…

每日学术速递5.5

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CL 1.ResiDual: Transformer with Dual Residual Connections 标题&#xff1a;ResiDual&#xff1a;具有双剩余连接的Transformer 作者&#xff1a;Shufang Xie, Huishuai Zhang, Jun…

制造企业选择库存管理条码工具需要关注哪些点?

Dynamsoft Barcode Reader SDK 一款多功能的条码读取控件&#xff0c;只需要几行代码就可以将条码读取功能嵌入到Web或桌面应用程序。这可以节省数月的开发时间和成本。能支持多种图像文件格式以及从摄像机或扫描仪获取的DIB格式。使用Dynamsoft Barcode Reader SDK&#xff0c…

OpenCV实战(22)——单应性及其应用

OpenCV实战&#xff08;22&#xff09;——单应性及其应用 0. 前言1. 单应性1.1 单应性基础1.2 计算两个图像之间的单应性1.3 完整代码 2. 检测图像中的平面目标2.1 特征匹配2.2 完整代码 小结系列链接 0. 前言 我们已经学习了如何从一组匹配项中计算图像对的基本矩阵。在射影…

读论文《大气压等离子体电离波沿介质管传输特性研究》

文章目录 一、研究背景和意义二、研究目的与内容三、电离波概述3.1 电离波与传统的流注放电3.2 电离波传输速度的计算方法 四、放电参数对电离波传输特性的影响4.1 施加电压与电压波形对电离波传输的影响4.1.1 交流高压对电离波的影响4.1.2 脉冲高压对电离波的影响![在这里插入…

《编程思维与实践》1047.Base64编码

《编程思维与实践》1047.Base64编码 题目 思路 直接模拟:将每个Base64编码值都分为两部分:前半部分由上一个字符求得,后半部分由下一个字符求得. 特别地,如果字符为第一个或最后一个,则直接可以求得Base64编码. 如下图: 其中,% 2 n 2^n 2n表示取出后n位的二进制位, 这是因…