学习swagger,使用正则改造项目, 生成接口文档

news2024/11/27 18:45:09

学习swagger,使用正则改造项目
关于Swagger+Knife4j生成统一接口文档教程请点击以下关于Swagger+Knife4j生成统一接口文档

1 关于构建swagger文档所需要的依赖和配置类

Swagger+Knife4j - 统一接口文档
我们以某一个项目的swagger升级改造为例。

2 如何使用正则表达式改造所有的entity注释为@ApiModelProperty(“架构角色”)

我们都知道经过1后,想要将项目中的每一个entity类都改造为swagger能接受的对象,是费时费力的,如果一个项目有50张表,好5个项目,然后每一张表需要添加@ApiModelPropertity注解的有10多个字段,加一个注解后还需要再将该属性特有的注释复制粘贴一遍,也就说总共最低需要复制粘贴50✖️ 5 ✖️10 * 4 = 2500次 ,而且加上一些其他的controller,model中需要添加swagger注解的部分,其实添加起来是非常麻烦且耗时的,这个时候可以利用idea中的正则表达式进行全局范围内的查找和替换。

因为需要改造的类不仅仅存在于项目的实体关系表中,还可能存在于其他的包的model类中,一般一个包内的所有类都有相似的特征,所以改造的粒度最好是包

注意点:
复制以下的正则表达式的时候一定要主要不要附带旁边的空格也复制了,否则会导致一些缩进的错误。

2.1 entity实体关系表特征分析

通过下面这张图可以明显看出,每一个实现关系类对应一张数据表,其中每一个字段都被统一格式的注释修饰,然后存在主键字段没有注释(需要特殊处理),且类中都被@Data,@TableName注解修饰

在这里插入图片描述

2.2 先在目标包内各个需要改造的类中导入swagger的相关类

1 分析:
我们都知道,每一个类都使用到了@Data注解,意味着引入了@Lombok类,所以我们先正则匹配@Lombok,然后再替换

2
(1)正则表达式1: ((import lombok.Data;)(\s+))
替换表达式1:import io.swagger.annotations.*;$3$1
替换前:

替换后:(因为还没有泳道swagger包所以呈现灰色)

上面这个使用了*号来表示引入swagger.annotations下的所有注解,不是很好,那么可以使用下面这种更细粒度的替换方式:

(2)正则2(推荐): ((import lombok.Data;)(\s+))
替换2: import io.swagger.annotations.ApiModel;$3import io.swagger.annotations.ApiModelProperty;$3$1

2.3 在每一个类名前添加@ApiModel注释

1
(1)正则:(@TableName((.*)))(\s+)
(2)替换:$1$3@ApiModel(description = $2)$3
(3)替换效果预览:
在这里插入图片描述

(4) 结果:我们发现有一部分替换报错了,点开看一下,发现是原来的部分TableName的值不是按照格式来的,但是好在这样的特例较少,这个时候只需要手动纠正即可
在这里插入图片描述

2 (推荐)
正则表达式2:(/*[\s\S]

\s+*\s(.)[\s\S]\n\s{1}*/?(\n))
替换表达式2:$1@ApiModel(“$2”)$3

2.4 为每一个属性添加@ApiModelProperty

1 正则表达式:/**\s\s{5}*\s(.)\s+*?/
2 替换表达式:@ApiModelProperty(“$1”)
这里的$1表示(.
)表示注释的内容
3 效果
替换前:
在这里插入图片描述

替换后:
在这里插入图片描述

2.5 特殊处理主键

1 有的主键属性之前存在注释,有的不存在,所以我们的策略是先使用2.4的正则表达式清除这个包下的所有注释,然后再添加注释(注意2.4必须在2.5前面执行,否则会造成误删)
2 正则: (@TableId(.(\n\s+))
替换:@ApiModelProperty(“主键”)$2$1
说明:$1表示 (@TableId(.
(\n\s+)) 代表的内容,$2表示(\n\s+)代表的具体内容
3 替换效果
替换前:
在这里插入图片描述

替换后:
在这里插入图片描述

3 改造controller包

3.1 分析

要导入的内容有
1 导入swagger依赖包:import io.swagger.annotations.*;
2 修饰在class类上的@Api注解
3 修饰在方法上的@ApiOperation注解
在这里插入图片描述

3.2 导入swagger依赖

(1)
正则:(import org.springframework.beans.factory.annotation.Autowired;)(\s+)
替换:import io.swagger.annotations.*;$2$1$2

(2)
正则:(import org.springframework.beans.factory.annotation.Autowired;)(\s+)
替换:import io.swagger.annotations.Api;$2import io.swagger.annotations.ApiOperation;$2$1$2

3.2 在class类上添加@Api注解
分析:可以看到每一个controller类的注释格式总是固定不变的,又因为我们要给@Api加上tags,所以就要以这个注释的内容作为正则表达式的目标对象,在它的下面加上注解
在这里插入图片描述

/**
 * <p>
 * 设备硬件表(部件表) 前端控制器
 * </p>
 *
 * @author xxxx
 * @since 2020-06-12
 */

可以看到这里的注释被

标签包围,这是重点,而且只会选择文字的前半段
正则:(\n)((/**\s+*\s

\s+*\s+(\S*)([\s\S]*?)*/)(\s+))
替换:$2@Api(tags = “$4”)$1
效果预览:
在这里插入图片描述

3.3 在路由方法上添加@ApiOperation注解

1 找出特征点:所有路由方法都会有一个public Message的开头

2
(1)
正则表达式:((\s+)(public Message))
替换表达式:$2@ApiOperation(value=“”)$1

3.4 为输入参数添加@ApiParam

以下两个表达式都要使用
1
(1)
正则表达式:((@PathVariable)(\s))
替换表达式:$1@ApiParam(“”)$3
(2)
正则表达式: (@RequestParam)
替换表达式:@ApiParam(“”)$1
以上两个分别使用会比较麻烦,现在可以融合一下
2
正则表达式: ((@RequestParam)|(@PathVariable))
替换表达式:@ApiParam(“”)\t$1

3.5 将@RequestBody String input接收方式改为@ApiParam @RequestBody ObjectDTO objectDTO

1 如下:本来的接收前端json字符串的方式是input,然后统一使用JSONTokener解析这个input字符串,这种接收方式优缺点:
当使用swagger接口文档的时候,文档中的输入参数只能显示一个input字段,前端开发人员而无法具体的知道这个input里面的具体的字段。
所以这就需要我们改造input为具体的DTO对象。

2 改造
正则表达式: (String\sinput)
替换表达式:
只需要先把这些符合条件的置空即可(置空后产生的报错不会让我漏掉一些接口),因为具体的DTO对象需要我们根据接口方法自定义。

4 改造Model
如果model包下的类作为controller方法的形参,用于接收前端传过来的数据时,这些被引用的类也需要加上swagger的特殊注解的。
以下有两种方法进行改造
4.1 当model中的类过多,而controller的接口比较少时
可以依据接口逐个查找使用到的model对象

4.2 当controller类中的接口方法过多时
可以利用idea的特性:会显示每一个创建对象的被引用次数以及具体的被哪些方法引用。
比如下面这幅图片,左边精确到一个类的一行语句,右边展示了那行语句的具体代码。直接根据右边的那行代码是不是作为接口的输入参数model即可知道是否要给这个model类加上特定的swagger注解

4.3 如何在model中使用正则
(1) model中应该以类为单位应用正则
(2) 依据各个类中的属性的声明情况写出相应的正则
(3) 属性被private 声明时,
正则表达式:((^(\s{4}).*;$)(\n))
替换表达式:$3@ApiModelProperty(“”)\n$1

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

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

相关文章

Discourse 的左侧边栏可以修改吗

在默认的 Discourse 配置中&#xff0c;我们左侧的边栏可以根据自己的要求进行修改吗&#xff1f; 解决办法 针对自己登录的用户&#xff0c;你是可以自己调整左侧边栏的配置。 单击右上角你的个人头像&#xff0c;然后选择属性。 在切换的界面中&#xff0c;选择属性。 在出…

Postman内置动态参数和自定义的动态参数以及断言方式

一、问题&#xff1a;每次请求均需手动修改参数 解决方案&#xff1a;使用动态参数&#xff1a;内置动态参数/自定义动态参数&#xff0c;解决上述问题 二、Postman动态参数 1、内置动态参数&#xff0c;表现形式&#xff1a;{{$}} 2、常用的内置动态参数 {{$timestamp}} …

基于模糊小波神经网络的空中目标威胁评估(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 在现代战争中, 随着信息化和智能化的飞速发展, 以及作战环境的日益复杂, 实时而准确地评估目标威胁, 不仅为空战决策提供科学的…

最全面的Spring教程(四)——Controller 与 RestFul

前言 本文为 【SpringMVC教程】Controller 与 RestFul 相关内容介绍&#xff0c;具体将对控制器Controller&#xff0c;实现Controller接口&#xff0c;使用注解Controller&#xff0c;RequestMapping及RestFul 风格&#xff08;包括&#xff1a;Rest架构的主要原则、什么是Res…

微服务框架 SpringCloud微服务架构 6 Nacos 配置管理 6.2 微服务配置拉取

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构6 Nacos 配置管理6.2 微服务配置拉取6.2.1 统一配置管理6.2.2 直接开干6.2…

从电商到超市,美团的零售之变

从上海回到湖南长沙县的时候&#xff0c;何靓做好了过“苦日子”的准备。作为一个湖南人&#xff0c;她知道县城往往意味着没有星巴克和喜茶&#xff0c;意味着仅有的一两座电影院环境不太好&#xff0c;意味着每天晚上九点后连便利店都大门紧闭。 但在真正回到这“半个故土”…

Cloudcomplare标注3D分割数据

免安装软件下载 https://www.sibspress.org/soft/23705.html 可以打开txt&#xff0c; pcd&#xff0c; ply等3D点云数据 将文件直接拖进软件内打开 选择剪切工具&#xff1a;剪刀&#xff0c;并设置线标注工具 鼠标左键选择区域&#xff0c; 鼠标右键结束选择 选择圈内或…

没睡醒就来上班的程序员解决BUG

仅以此篇纪念我在低级错误面前烦躁又蒙B的3分钟。 今早&#xff0c;我在公司系统上点了一下我负责模块里的一个查询。我靠&#xff0c;这个查询条件竟然没生效。 看代码&#xff0c;原来xml文件里的SQL没写这个查询条件&#xff0c;这太简单了&#xff0c;加上。&#xff09;…

vue - vue使用echarts实现中国地图和点击省份进行查看

文章目录1&#xff0c;实现的效果和功能2&#xff0c;安装ECharts3&#xff0c;main.js里面引入echarts4&#xff0c;实现如下5&#xff0c;遇到的问题6&#xff0c;用到的模拟数据1&#xff0c;实现的效果和功能 vue使用echarts实现中国地图和点击省份进行查看&#xff1b; 下…

嵌入式开发--Altium技巧:原理图设置

Altium的默认设置&#xff0c;有一些是很不合理的选项&#xff0c;强烈建议大家修改。 在工程上点右键&#xff0c;并在弹出的菜单上选择最后一项&#xff1a;Project Options&#xff0c;即项目设置 弹出如下界面&#xff0c;如果操作不当&#xff0c;设置错了&#xff0c;可…

STM32 bit-band位带操作

在51单片机中&#xff0c;我们可以通过sbit命令来操作存储器中的位&#xff0c;在STM32中&#xff0c;我们同样可以操作存储器中特定的位。 1、为何使用位带操作&#xff1f; 总结来说&#xff0c;一个是因为访问速度快&#xff0c;另一个是因为安全。 如果在裸机开发中&…

【学习笔记69】函数的柯里化

一、认识函数的柯里化 将一个接受多个参数的函数&#xff0c;更改为需要调用多次, 每次只传一个参数的函数利用了闭包, 延长了 外部函数的参数使用时间&#xff08;一&#xff09;基础版 function sum (a, b) {console.log(a b)}sum(10, 20);sum(10, 30);sum(10, 40); &#x…

2022卡塔尔世界杯小组赛出线形势分析指南——德国队会被西班牙做掉吗?

早点关注我&#xff0c;精彩不错过&#xff01;&#xff08;德国队出现形势分析在文末&#xff0c;可直接跳转。&#xff09;北京时间今天晚上11点整&#xff0c;如火如荼的卡塔尔世界杯就将展开小组赛第三轮比赛的争夺&#xff0c;8个小组轮番同时进行最后一轮较量&#xff0c…

2022年全网最全AI绘画产品整理(一共23款,免费的绘画次数用到你手软)

1、飞链云版图 【免费】 扫码或搜索微信小程序&#xff1a;飞链云版图 注册即赠送100次AI绘画次数&#xff0c;每天分享可以免费获取到110次AI绘画次数&#xff1b; 完全够普通人到日常绘画需求&#xff1b;如果你有大量的绘画需求&#xff08;月绘画次数过万&#xff09;&am…

Win10升级Win11必备的5款免费软件

目前win7渐渐退出视野&#xff0c;大部分人都开始使用win10了&#xff0c;甚至win11都开始渐渐进入视野了。 1.文件预览工具——Seer 以前我们在预览文件的时候&#xff0c;需要通过双击打开才能查看内容&#xff0c;如果文件过多&#xff0c;一个个点开就太麻烦了。Seer以前…

Flutter 应用程序更新

Flutter 应用程序更新 原文 https://medium.com/flutter-community/in-app-update-the-flutter-way-2f25e4a02c02 前言 当您推出应用程序的新版本时&#xff0c;您希望您的用户了解它。无论是因为您修复了一个关键的 bug&#xff0c;添加了一个新特性&#xff0c;还是仅仅因为应…

Python基础(八):循环深入讲解

文章目录 循环深入讲解 一、循环简介 1、循环的作用 2、循环的分类 二、while的语法 1、快速体验 三、while的应用 1、应用一&#xff1a;计算1-100累加和 2、应用二&#xff1a;计算1-100偶数累加和 四、break和continue 1、理解 五、while循环嵌套 1、应用场景 …

YOLO V3 详解

YOLO V3 论文链接&#xff1a;YOLOv3: An Incremental Improvement 主要改进 Anchor: 9个大小的anchor&#xff0c;每个尺度分配3个anchor。Backbone改为Darknet-53, 引入了残差模块。引入了FPN&#xff0c;可以进行多个尺度的训练&#xff0c;同时对于小目标的检测有了一定…

【微服务】RestClient操作文档

为了与索引库操作分离&#xff0c;我们再增加一个测试类&#xff0c;做两件事情&#xff1a; 初始化RestHighLevelClient我们的酒店数据在数据库&#xff0c;需要利用IHotelService去查询&#xff0c;所以注入这个接口 package cn.itcast.hotel;import cn.itcast.hotel.pojo.…

【车载开发系列】UDS诊断---电控单元复位 ($0x11)

【车载开发系列】UDS诊断—电控单元复位&#xff08;$0x11&#xff09; UDS诊断---电控单元复位&#xff08;$0x11&#xff09;【车载开发系列】UDS诊断---电控单元复位&#xff08;$0x11&#xff09;一.概念定义二.应用场景三.报文格式1&#xff09;请求2&#xff09;肯定响应…