自己动手写个 IDEA 高效插件:Swagger注解、JavaDoc一键生成

news2025/2/24 0:21:16

下面是一个普通的Request类,先简单的看一下:

/**
 * TestRequest desc
 */
@Data
@Slf4j
public class TestRequest {
    private String name;
    private Integer age;
    private Address address;
    /**
     * address desc
     */
    @Setter
    @Getter
    public static class Address {
        private String country;
        private String province;
        private String city;
    }
}

因为公司的要求,我们需要使用Protobuff完成序列化工作,并且需要生成API文档,所以我们一般需要补上Swagger注解和Tag注解。为了补上这两种注解,你需要一点一点地敲键盘了。

稍微思考一下就会发现,补充Swagger注解的方法,一般是将相关POJO中同名字段的JavaDoc复制过来,改为Swagger注解的格式即可,而补充Tag注解更简单了,就是无脑的对字段按顺序进行编号,只要保证编号的顺序是递增的且不重复即可。

很明显,上述工作是重复、单调、乏味、无聊、机械的,一切重复、单调、乏味、无聊、机械的工作都可以解放出来,下面直接给出解决方案,使用文字+图片解释太单薄了,直接给出动图:

图片

当然了,这个功能不止可以操作普通的POJO类,Controller类也是可以处理的:

图片

简单来说,我写了一个IDEA插件,在需要添加/删除Swagger注解、Tag注解、JavaDoc注释方面,能够明显提效,尽可能将大家从重复、单调、乏味、无聊的工作中解放出来。

快速开始

想要获得这个插件很简单,打开 Jetbrains Marketplace 的插件页面,直接下载、安装即可:

https://plugins.jetbrains.com/plugin/22348-bitkylin-universal-generate

当然了,直接打开 IntelliJ IDEA 进入 Settings -> Plugins -> Marketplace,搜索 Bitkylin Universal Generate 也能够找到。

安装后,记得进入 Settings -> Tools -> Bitkylin Universal Generate,将语言切换到中文(插件考虑到了国际化,所以默认英文哦😉)。

图片

插件的基本用法,上面的动图中略微展示了一下,不过动图中只展示了两个功能。打开右键菜单后可以看到,新增了好几个功能哦,他们都是做什么的呢?

图片

核心功能

你可以通过右键菜单,一键生成Swagger注解:@Api@ApiOperation@ApiModel@ApiModelProperty,一键生成Protostuff注解:@Tag

全局生成注解的最佳实践,就是上面的动图中演示的那样,除了上面列出的全局一键生成注解外,还是有一些扩展功能,下面系统介绍一下插件的核心功能。

对整个文档处理,统一生成注释、注解

就像上面两张动图中演示的那样,我们随意打开右键菜单,可以看到选项说明中,作用范围是整个文档,此时执行各个功能时,会对整个文档中的所有元素进行处理。

图片

可以对指定字段单独生成注释、注解

除了对整个文档统一处理外,你也可以对单个字段进行处理,比如还是对上面列出的那个POJO类进行操作。首先将光标指向某个字段名,打开右键菜单,此时插件功能全都变更为了对当前字段进行处理。依次进行如下操作:

  • 删除JavaDoc注释

  • 删除刚刚生成的Swagger注解

  • 填充JavaDoc注释

  • 填充Swagger注解

图片

整个操作行云流水~~~

当然我承认,手动删除一个字段的JavaDoc注释、注解,比使用插件删除效率更高。。。但是如果要删除整个类中所有的JavaDoc注释、注解,还是使用插件效率更高:

图片

除了对POJO类中的字段进行操作外,也可以将光标指向Controller类的方法、类名,指向POJO类的类名,选择相应的功能即可对指定的元素进行处理。

将API层的POJO类转换为Service层的POJO类

因为我们需要生成API文档,我们需要使用Protobuff完成序列化工作,所以我们一般需要在API层的POJO类上补充Swagger注解和Tag注解,但是Service层的POJO类不需要这些注解,最多只需要填充JavaDoc注释即可。

考虑这样一个场景:我们和二方对接时,拿到了一个二方API,为了对API进行隔离,我们可以将二方API中定义的Request、Response类复制一份在Service层自己用,可以考虑下面的操作:

  • 将POJO类中的Swagger注解转换为JavaDoc注释

  • 删除POJO类中的所有Swagger、Tag注解

这些操作同样是上面说的重复、单调、乏味、无聊、机械的工作,同样可以使用插件一键完成。上面演示了一大堆令人眼花缭乱的功能,我们打开右键菜单梳理一下,插件提供的四个选项中,除了「注解转JavaDoc」外,都演示过了。那么很显然,这个场景涉及到的就是「注解转JavaDoc」这个功能。

图片

我们使用「注解转JavaDoc」功能,对整个文档一键处理,直接看动图:

图片

使用插件可以一键优雅完成,如果手动做的话,那是真的浪费生命了!

功能释义

上面演示了插件的核心功能,如果仅仅看动图的话,肯定会有很多疑惑的,这一小节尽可能的解释各个功能及其原理。

删除元素

这个功能有四个子选项,可以自由选择要删除的元素哦。一键删除整个文档中的注释、注解,其实还是很好用的。

图片

插件在展示选项前,会检测当前项目是否有swagger、protostuff依赖,如果没有相关依赖,相关选项也是没有的哦。

生成注解

上面演示的最多的就是这个功能,该功能会在Controller类相关元素上添加@Api@ApiOperation注解,会在POJO类的相关元素上添加@ApiModel@ApiModelProperty@Tag注解。

目前标注@Controller@RestController注解的类,或类名以Controller结尾的类,会被识别为Controller类。标注@Data@Getter@Setter注解的类,会被识别为POJO类。如果大家有更好的识别Controller类和POJO类的方法可以留言😁。

值得一提的是,@Tag注解中的序号,会根据字段所处位置的不同,进行动态填充哦,原则是尽可能保证有序、唯一。

注解转JavaDoc

核心用法是,上面重点介绍的「将API层的POJO类转换为Service层的POJO类」场景,该功能做了以下事情:

  • 将Swagger注解中的value字段值提取出来,转换为JavaDoc注释

  • 删除POJO类中的所有Swagger、Tag注解

查找JavaDoc

该功能用于给无任何注释、注解的字段,添加JavaDoc注释。那么问题来了,JavaDoc注释是从哪来的呢?

首先不是由AI生成的,因为AI生成的文本不一定符合语义,并且较为缓慢,成本还高,需要联网,因为有上述缺点所以废弃了该方案。其次不是将字段文本使用各种「翻译」工具翻译过来的,因为翻译功能同样有不符合语义,较为缓慢,成本高,需要联网的缺点。然而插件中该功能的特点是,语义尽可能精确、速度快、不用联网,这是怎么做到的呢?

首先则怎么才能做到语义精确呢?自然是你曾经使用过这个字段,并且标注过这个字段的含义。你在使用IntelliJ IDEA打开一个Project时,IDEA会对该Project中的各个单词、文件名、文件类型等各种元素生成索引。

为什么IDEA中的搜索功能能够快速找到指定的元素,就是这些索引的功劳,当然索引不只能IDEA自己用,我们开发的插件也能用,具体可以参考Jetbrains的官方文档:

https://plugins.jetbrains.com/docs/intellij/file-based-indexes.html#implementing-a-file-based-index

当你对某个字段使用「查找JavaDoc」功能时,插件会检索到项目中的所有同名字段,通过精确或模糊匹配的方式,将所有相关的字段全都检索出来,然后把他们的JavaDoc注释全都提取出来,去重、输出就可以了。实际原理还是很简单的,过程看起来繁琐,但是执行效率极高哦,我监控过耗时,大概率不会超过1毫秒。

「填充」和「重新生成」的区别

插件中每个功能都有多个选项,填充、重新生成、合并,他们有什么区别呢?

图片

图片

  • 填充: 当前「类、字段、方法」中已经存在指定的「注解、注释」时,不会再重新生成相应的「注解、注释」。

  • 重新生成: 不管当前「类、字段、方法」中是否已经存在指定的「注解、注释」,会将已存在的「注解、注释」直接删除,然后再重新生成相应的「注解、注释」。

  • 合并: 当前「类、字段、方法」中如果已经存在指定的JavaDoc注释,还是会重新生成新的JavaDoc注释,并将其合并到原先的JavaDoc中一起展示,新、老JavaDoc注释都会保留哦。

最后说一句(求关注!别白嫖!)

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。

关注公众号:woniuxgg,在公众号中回复:笔记  就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!

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

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

相关文章

Qt扫盲-Qt D-Bus概述

Qt D-Bus概述 一、概述二、总线三、相关概念1. 消息2. 服务名称3. 对象的路径4. 接口5. 备忘单 四、调试五、使用Qt D-Bus 适配器1. 在 D-Bus 适配器中声明槽函数1. 异步槽2. 只输入槽3. 输入输出槽4. 自动回复5. 延迟回复 一、概述 D-Bus是一种进程间通信(IPC)和远程过程调用…

第29章-SR技术概述

1. SR技术的产生背景 2. SR技术的基本概念 3. SR技术的基本原理 1. SR技术的产生背景 1.1 传统的路由器设备因其转发性能较低 ① 最长匹配算法的缺点,需要遍历整个路由表; ② 早期路由器多采用通用CPU进行转发处理,性能有限; ③…

第七届机电、机器人与自动化国际会议(ICMRA 2024)即将召开!

第七届机电、机器人与自动化国际会议(ICMRA 2024)将于2024年9月20日-22日在中国武汉举行。ICMRA 2024为各国专家学者提供一个学术交流的平台,讨论机电、机器人和自动化领域的最新研究成果和未来的研究方向,旨在能够建立起国家间&a…

(五)JSP教程——response对象

response对象主要用于动态响应客户端请求(request),然后将JSP处理后的结果返回给客户端浏览器。JSP容器根据客户端的请求建立一个默认的response对象,然后使用response对象动态地创建Web页面、改变HTTP标头、返回服务器端地状态码…

【Redis7】了解Redis

1.常见数据库 1.1.键值存储数据库 如 Map 一样的key-value 对,典型代表就是 Redis。 1.2.列存储数据库 关系型数据库是典型的行存储数据库,按行存储的数据在物理层面占用的是连续存储空间,不适合海量数据存储。而按列存储则可实现分布式存储&…

新火种AI|马斯克聘用OpenAI泄密者,他们的梁子着实越结越深...

作者:小岩 编辑:彩云 就在最近,昔日就职于OpenAI的工程师Pavel Izmailov正式加入了马斯克的AI团队,他还在自己的推特上大张旗鼓的做着宣传:研究院xai。 AI工程师的跳槽本不值得惊讶,但Pavel的跳槽却在行…

什么牌子的洗地机质量最好?四款耐用高分产品推荐

洗地机具备了吸尘、擦拭、除菌等多种功能,可以一次完成多种清洁任务,帮助用户更高效地保持家居整洁,节省时间和精力,备受人们的喜爱。但是怎么挑选到优质的洗地机一直是大家关注的问题。今天,笔者将结合自己在家电行业…

mac通过termius连接Linux服务器

mac上安装 linux系统 如果有 linux服务器账号密码,那么上一步可忽略; 比如:直接连接阿里云或腾讯云账号 1. 安装termius 链接: https://pan.baidu.com/s/1iYsZPZThPizxqtkLPT89-Q?pwdbw6j 提取码: bw6j 官网 Termius - SSH platform for …

Linux-信号保存

1. 概念 进程执行信号的处理动作,称为 信号递达(Delivery) 信号从产生到递达之间的状态,称为 信号未决(Pending) 进程可以选择 阻塞(Block)某个信号 过程: 信号产生 ——…

flowable一对并发网关跳转的分析

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: h…

hadoop学习---基于Hive的聊天数据分析报表可视化案例

背景介绍: 聊天平台每天都会有大量的用户在线,会出现大量的聊天数据,通过对聊天数据的统计分析,可以更好的对用户构建精准的用户画像,为用户提供更好的服务以及实现高ROI的平台运营推广,给公司的发展决策提…

二进制,八进制,十六进制转十进制 c++

紧接着十进制转二进制,八进制,十六进制-CSDN博客这篇文章 输入一个二进制,八进制的数,怎样能转化为十进制呢? 原理如下: K进制转十进制 按权相加法展开成一个多项式,每项是该位的数码与相应…

Maven+Junit5 + Allure +Jenkins 搭建 UI 自动化测试实战

文章目录 效果展示Junit 5Junit 5 介绍Junit 5 与 Junit 4 对比PageFactory 模式编写自动化代码公共方法提取测试用例参数化Jenkins 搭建及配置参数化执行生成 Allure 报告Maven 常用命令介绍POM 文件效果展示 本 chat 介绍 UI 自动化测试框架的搭建: 运用 page factory 模式…

高速开箱机价格与性能解析:如何挑选适合您的开箱解决方案?

随着电商和物流行业的迅猛发展,高效、自动化的包装设备成为了提升工作效率、减少人工成本的必备利器。高速开箱机作为其中的重要一环,其性能与价格成为了许多企业和个人关注的焦点。星派将深入探讨高速开箱机的价格与性能之间的关系,帮助您在…

基于springboot+vue+Mysql的口腔管理平台

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

Linux无root配置Node,安装nvm

1. 安装NVM: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash # 或者,如果你使用wget wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash 对于bash用户,可以运行&…

时序图详解

1.这是iic总线在回应时候的时序图,data in代表eeprom收到数据,回stm32的ack,数据回应,data out代表stm32收到eeprom的消息,数据输出ack回应 2.交叉线 代表在这一次输出高电平,或者在这一次也可能输出低电…

《武林秘籍》——闪侠惠递如何让消费者寄快递更安心!

现如今,网上下单寄快递的便利性让众多人享受到了电商物流飞速发展带来的红利性。今天小编直接介绍一款寄快递特别省钱的利器,就是利用闪侠惠递来寄快递。闪侠惠递寄快递,真正的实现了便宜寄快递发物流的便捷性,开创了低价发快递的…

Hypack 2024 简体中文资源完整翻译汉化已经全部完成

Hypack 2024 简体中文资源完整翻译汉化已经全部完成 Hypack 2024,资源汉化共翻译11065条。毕竟涉及测绘、水文、疏浚等专业术语太多,翻译有很多理解不正确的地方,望各位专业人员指正。 压缩包内包含Hypack 2024、Hypack 2022、Hypack 2021、…

企业如何用数字化为预提摊销业务赋能?

对于企业来说,想要实现系统化、智能化、自动化的预提摊销管理,需要做足哪些功课?常见场景下的业务难题又该如何破解?今天胜意科技就给大家介绍一下,企业如何通过数字化手段搞定预提摊销业务难题。 一、预提摊销痛点 在…