基于SpringBoot3从零配置SpringDoc

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

系列文章指路👉

系列文章-基于SpringBoot3创建项目并配置常用的工具和一些常用的类

文章目录

  • 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注解,生成后需要手动添加(随着表的增多和表结构的复杂化,这部分工作量是很大的),希望苞米豆大大们支持一下。

2023-05-10更新: MybatisPlus最新的代码生成器(3.5.3.1)支持了生成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

在这里插入图片描述

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

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

相关文章

PCL学习八:Keypoints-关键点

参考引用 Point Cloud Library黑马机器人 | PCL-3D点云 PCL点云库学习笔记&#xff08;文章链接汇总&#xff09; 1. 引言 关键点也称为兴趣点&#xff0c;它是 2D 图像或 3D 点云或曲面模型上,可以通过检测标准来获取的具有稳定性、区别性的点集。从技术上来说&#xff0c;关键…

Microsoft Edge新功能测评体验

Microsoft Edge使用体验 Microsoft Edge是一款现代化的浏览器&#xff0c;它拥有众多功能和强大的性能&#xff0c;为用户带来更加流畅的浏览体验。 Edge最近推出了分屏功能&#xff0c;支持一个窗口同时显示两个选项卡&#xff0c;这可以大大提高生产力和多任务处理能力。 一…

API接口对程序员的帮助有哪些,参考值简要说明

API接口对程序员的帮助有哪些 提高开发效率&#xff1a;通过API接口&#xff0c;程序员能够在不用重复编写代码的情况下&#xff0c;直接获取其他应用程序提供的服务或数据&#xff0c;极大地提高了开发效率。 减少错误率&#xff1a;使用API接口可以避免手动输入数据容易出现…

洛谷P5047 [Ynoi2019 模拟赛] Yuno loves sqrt technology II(离线区间逆序对+莫队二次离线)

题目 给你一个长为n(1<n<1e5)的序列a(0<ai<1e9)&#xff0c; m(1<m<1e5)次询问&#xff0c;每次查询一个区间[l,r]的逆序对数&#xff0c;可离线。 思路来源 登录 - 洛谷 三道经典分块题的更优复杂度解法&[Ynoi2019模拟赛]题解 - 博客 - OldDriverT…

Flutter性能分析工具使用

使用前提 flutter常用的性能分析工具&#xff0c;这些工具都集成在android studio中&#xff0c;基本能满足我们的需求了。在下面介绍的几个工具中&#xff0c;Flutter Performance和Flutter Inspector都能够直接在debug模式下使用&#xff0c;但是DevTools只能在profile模式下…

typescript:熟练掌握typescript

一、简介 TypeScript 教程 | 菜鸟教程 TypeScript (简称:TS)是JavaScript的超集 (JS有的TS 都有)。 TypeScriptType JavaScript (在JS 基础之上&#xff0c;为JS添加了类型支持)。 哔哩哔哩_教程_TypeScript 二、TypeScript为什么要为js增加类型支持&#xff1f; 背景&am…

4年外包出来,5次面试全挂....

我的情况 大概介绍一下个人情况&#xff0c;男&#xff0c;毕业于普通二本院校非计算机专业&#xff0c;18年跨专业入行测试&#xff0c;第一份工作在湖南某软件公司&#xff0c;做了接近4年的外包测试工程师&#xff0c;今年年初&#xff0c;感觉自己不能够再这样下去了&…

鲲鹏展翅 信安高飞 | 鲲鹏开发者峰会2023-麒麟信安技术论坛成功举办!

2023年5月6日-7日&#xff0c;以“创未来 享非凡”为主题的鲲鹏开发者峰会2023在东莞松山湖举办。鲲鹏产业生态繁荣&#xff0c;稳步发展&#xff0c;正在成为行业核心场景及科研领域首选&#xff0c;加速推动数字化转型。 作为鲲鹏生态重要合作伙伴&#xff0c;麒麟信安受邀举…

Notion Ai中文指令使用技巧

Notion AI 是一种智能技术&#xff0c;可以自动处理大量数据&#xff0c;并从中提取有用的信息。它能够 智能搜索&#xff1a;通过搜索文本和查询结果进行快速访问 自动归档&#xff1a;可以根据关键字和日期自动将内容归档 内容分类&#xff1a;可以根据内容的标签和内容的…

交互式数据分析和处理新方法:pandas-ai =Pandas + ChatGPT

Python Pandas是一个为Python编程提供数据操作和分析功能的开源工具包。这个库已经成为数据科学家和分析师的必备工具。它提供了一种有效的方法来管理结构化数据(Series和DataFrame)。 在人工智能领域&#xff0c;Pandas经常用于机器学习和深度学习过程的预处理步骤。Pandas通…

基于JavaWeb实现的汽车维修管理系统

【简介】 本系统基于springboot mybatis jps架构开发&#xff0c;前后端分离&#xff0c;开发环境为jdk1.8、mysql、maven。系统功能主要分为汽车维修管理、配件管理、财务管理、基础数据管理、系统维护5大模块。 【功能结构】 【技术架构】 系统架构&#xff1a;springboot …

深度学习第J6周:ResNeXt-50实战解析

目录 一、模型结构介绍 二、前期准备 三、模型 三、训练运行 3.1训练 3.2指定图片进行预测 &#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&#xff08;版权归 *K同学啊* 所有&#xff09; &#x1f356; 作者&#xff1a;[K同学啊] &#x1f4cc; …

移动端异构运算技术 - GPU OpenCL 编程(基础篇)

一、前言 随着移动端芯片性能的不断提升&#xff0c;在移动端上实时进行计算机图形学、深度学习模型推理等计算密集型任务不再是一个奢望。在移动端设备上&#xff0c;GPU 凭借其优秀的浮点运算性能&#xff0c;以及良好的 API 兼容性&#xff0c;成为移动端异构计算中非常重要…

Echarts使用本地JSON文件加载不出图表的解决方法以及Jquery访问本地JSON文件跨域的解决方法

前言 最近需要做一个大屏展示&#xff0c;需要用原生html5cssjs来写&#xff0c;所以去学了一下echarts的使用。在使用的过程中难免碰到许多BUG&#xff0c;百度那是必不可少的&#xff0c;可是这些人写的牛头不对马嘴&#xff0c;简直是标题党一大堆&#xff0c;令我作呕&…

fastjson 代码执行 (CNVD-2017-02833)

漏洞存在原因 在fastjson<1.2.24版本中&#xff0c;在解析json的过程中&#xff0c;支持使用autoType来实例化某一个具体的类&#xff0c;并调用该类的set/get方法来访问属性。而在1.24<fastjson<1.2.48版本中后增加了反序列化白名单。 漏洞复现过程如下 在vulfocu…

龙的画法图片

由龙老师画素描中国龙的方法,大概可以遵循以下步骤: 确定龙的姿态和比例:在纸上简单地画出龙的基本形状和姿态,包括身体的长度,颈部、腿和尾巴的位置和比例关系。 添加细节:在基本形状的基础上,开始添加一些细节,如龙的头部、眼睛、鼻子、嘴巴、爪子等。注意要保持姿态和比例…

UU跑腿“跑男失联”:同城即配服务赛道商业逆袭难?

五一假期&#xff0c;人们纷纷走出家门&#xff0c;要么扎堆奔向“远方”&#xff0c;要么、享受本地烟火气息。 据文化和旅游部数据中心测算&#xff0c;劳动节假期&#xff0c;全国国内旅游出游合计2.74亿人次&#xff0c;同比增长70.83%。 五一假日的郑州东站 面对人山人海…

Docker 应用部署-MySQL

一、安装MySQL 1搜索mysql镜像 docker search mysql 2拉取mysql镜像 docker pull mysql:8.0.20 3创建容器 通过下面的命令&#xff0c;创建容器并设置端口映射、目录映射 #在用户名目录下创建mysql目录用于存储mysql数据信息 mkdir /home/mysql cd /home/mysql #创建docker容…

Python图形化编程开源项目拼码狮PinMaShi

开源仓库 #项目地址 https://github.com/supercoderlee/pinmashi https://gitee.com/supercoderlee/pinmashiPinMaShi采用electron开发&#xff0c;图形化拖拽式编程有效降低编程难度&#xff0c;对Python编程的初学者非常友好&#xff1b;积木式编程加快Python程序的开发&…

微服务介绍 SpringCloud,服务拆分和远程调用,注册中心Eureka,负载均衡Ribbon,注册中心Nacos

一、微服务介绍 1.系统架构的演变 什么是微服务&#xff0c;微服务有哪些特征SpringCloud是什么SpringCloud与Dubbo的区别 1.单体架构 将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署。当网站流量很小时&#xff0c;单体架构非常合适 1.单体架构 优点&a…