自定义SpringBootSwagger中ApiModel默认名称
前言
项目使用的springfox-swagger2@2.9.2版本
在 Spring 中集成 swagger 文档功能,需要通过@ApiModel注解修饰出入参的类,但是如果有两个不同包下的相同名称的类都使用了@ApiModel注解时,会导致文档被覆盖,例如:com.example.demo.login.dto.UserDTOpackage com.example.demo.login.dto; @Data @ApiModel public class UserDTO{ @ApiModelProperty("姓名") private String name; @ApiModelProperty("年龄") private Integer age; }com.example.demo.vip.dto.UserDTOpackage com.example.demo.vip.dto; @Data @ApiModel public class UserDTO{ @ApiModelProperty("姓名") private String name; @ApiModelProperty("会员级别") private Integer vipLevel; }
上面两个类生成出来的文档会变成一个swagger model:
从而导致接口文档显示错误:
解决冲突修改@ApiModel 注解(推荐)
通过修改@ApiModel 的 value 属性,来规避同名冲突,修改之后为:package com.example.demo.login.dto; @Data @ApiModel("login$UserDTO") public class UserDTO{}package com.example.demo.vip.dto; @Data @ApiModel("vip$UserDTO") public class UserDTO{}
可以看到生成了两个swagger model:
修改类名
把两个类名做修改,让类名不冲突即可。自定义 swagger 插件
然而上面解决冲突的方式还是太麻烦了,定义一个文档的出入参类而已,还要考虑类重名的问题,这种增加心智负担和工作量的问题应该要尽量避免掉的,我在想有没有可能做到每个类上只需要加上@ApiModel注解就行,剩下的冲突问题全部不用考虑。
于是乎通过跟踪源码,找到了swagger model名称生成的地方,详见:github
可以看到取名的逻辑是,优先取@ApiModel的value值,如果没有就会使用defaultTypeName,跟进去一看,defaultTypeName是直接取类的简称,代码如下:
正是因为默认情况下取类的简称,导致不同包名下的同名类生成出来的swagger model被覆盖。原因已经分析出来了,接下来其实就是看看能不能定制化这个super.nameFor(type)方法了,然而很遗憾这个方法是写死的,没地方下手,但是ApiModelTypeNameProvider这个类上两个注解@Component和@Order已经明示了这个是一个Spring bean,并且是通过Spring插件机制进行加载的,所以可以自定义一个插件来完成,在默认时通过完整的类路径和类名来生成唯一的swagger model,代码如下:@Component @Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER - 100) public class FullPathTypeNameProvider extends DefaultTypeNameProvider { public static final String SPLIT_CHAR = "#34;; @Override public String nameFor(Class<?> type) { ApiModel annotation = AnnotationUtils.findAnnotation(type, ApiModel.class); if (annotation == null) { return super.nameFor(type); } if (StringUtils.hasText(annotation.value())) { return annotation.value(); } // 如果@ApiModel的value为空,则默认取完整类路径 int packagePathLength = type.getPackage().getName().length(); return Stream.of(type.getPackage().getName().split(".")) .map(path -> path.substring(0, 1)) .collect(Collectors.joining(SPLIT_CHAR)) + SPLIT_CHAR + type.getName().substring(packagePathLength + 1); } }
效果如下:
后记
通过这一个小小的优化,就可以减少许多团队中不必要的沟通成本,让我们能更专注于业务开发。
本文首发于我的博客:https://monkeywie.cn,欢迎收藏!不定期分享JAVA、Golang、前端、docker、k8s等干货知识。
造出一块更好的屏幕有多难眼前的黑不是黑。文丨张家豪编辑丨程曼祺这样一项技术,索尼从高校实验室里发现了它,并做出了最早的样品,韩国三星对它持续投入,但进展不算迅速京东方华星光电等中国公司也在近5年跟进,据公
2022,造车的玩法变了深途(shentucar)原创作者黎明编辑魏佳轰轰烈烈的造车运动,到了新的一年丝毫没有减速的迹象。在过去一个月,索尼官宣造车,小牛电动创始人李一男造车的官图发布,售价超过100万元
Arm为何选择赴美上市?科技心语在全球最大手笔的芯片收购交易案告吹后,软银CEO孙正义表示,Arm将最有可能在美国纳斯达克交易所上市,而此前市场预期Arm计划在伦敦上市。英国芯片巨头赴美上市的选择反映了芯片市场对
如果不分红,华为会怎样?华为正处于一个艰难时期,出于企业和员工共度时艰的考虑,华为此时不分红,或者再降低一些分红额度,似乎也合理。但此时仍然分红,体现了企业担当文顾翎羽编辑谢丽容关注华为2021年员工持股
我在互联网大厂当审核员2022年春节后的第一个工作日,一则B站审核组组长加班猝死的消息引起社会热议。互联网审核员这个幕后职业也随之被推到聚光灯下。红星资本局发现,互联网审核员的现状,也是一个行业成长的缩
俄罗斯一台光刻机都没有,为什么不怕被卡脖子?值得中国学习阅读下面文章之前,希望您能够在上方点个免费的关注!接下来您每天都能够收到免费的国际资讯哟!您的关注是我的动力多多支持下嘛!!自从进入到科技时代,世界各国的发展就在不断加速,仅仅20
科技赋能冬奥惊喜连连2022北京冬奥会激战正酣,来自世界各地的顶尖高手在不同的赛场上尽情挥洒着自己的天赋,体验着站在最顶级赛场的乐趣,同时也为全世界观众带来一场场视觉盛宴。而在赛场外,从厨房到卧室,从
cpuid和序列号背后的那些故事最近测试反馈了一个问题,每次重启服务器,我们某个版本的业务系统中的机器码都会改变,导致根据机器码算出来的许可证失效,从而使软件无法使用。这个问题反馈了有一段时间了,但是本地一直没复
最新揭秘小米米家智能门锁推拉式真实感受曝光?真实体验曝光智能门锁电子门锁行业发展至今,消费者的选购过程经历了从简单到复杂再回归简单的过程。小米的质量非常好,毋庸置疑。外观设计非常精良做工材质很重,很厚实。智能功能功能强大,指纹,密码,手
最详细教程最新ACR14。2独立安装包(WinMac)三天之前,上一期的最新版PS2022(自带ACR14。2)推送之后,有不少朋友反馈说整个PS2022升级安装包太大了,不仅下载比较麻烦,而且还要把整个PS覆盖安装,太费事儿。我不想
今天是腾讯QQ23岁生日,官方视频揭秘小企鹅塞红包和送消息IT之家2月10日消息,今天2月10日,是QQ的23岁生日!腾讯官方表示,其实QQ背后一直隐藏着一个不为人知的世界!腾讯表示,为了在往后的日子里,QQ能和大家更好地拥抱彼此,感情继