看着项目中古老的Swagger API文档样式,这次我终于下定决心要给它升个级了。升级过程中遇到了好多坑,不过只要用好Maven,这些都不是个事!

选择升级版本

首先我们选择下需要升级的版本,直接去Maven仓库看下,哪个版本使用的比较多。虽然有最新版本2.10.x,但是几乎没什么人用,而上一个版本2.9.x使用的人却很多,看样子还是2.9.x版本比较稳定,我们选择升级到2.9.2版本。

升级Swagger

接下来我们就可以开始升级Swagger版本了,原来项目里用的是2.7.0版本。

  • 由于mall项目使用父项目来统一管理依赖,所以只要修改父项目中的Swagger依赖版本即可,父项目的pom.xml在项目根目录下;

<properties><swagger2.version>2.9.2</swagger2.version>
</properties>
  • 运行mall-admin项目发现无法启动,报错信息如下,有个依赖里面的某个方法找不到了,一看是guava里面的,估计是版本的问题;

***************************
APPLICATION FAILED TO START
***************************Description:An attempt was made to call a method that does not exist. The attempt was made from the following location:springfox.documentation.schema.DefaultModelDependencyProvider.dependentModels(DefaultModelDependencyProvider.java:79)The following method did not exist:com.google.common.collect.FluentIterable.concat(Ljava/lang/Iterable;Ljava/lang/Iterable;)Lcom/google/common/collect/FluentIterable;The method's class, com.google.common.collect.FluentIterable, is available from the following locations:jar:file:/C:/Users/macrozheng/.m2/repository/com/google/guava/guava/18.0/guava-18.0.jar!/com/google/common/collect/FluentIterable.classIt was loaded from the following location:file:/C:/Users/macrozheng/.m2/repository/com/google/guava/guava/18.0/guava-18.0.jarAction:Correct the classpath of your application so that it contains a single, compatible version of com.google.common.collect.FluentIterableProcess finished with exit code 1
  • 当有好几个依赖都使用了不同版本的guava包时,Maven是如何选择的呢?Maven是按照就近原则选择的,层级越是浅的依赖越会被选择;

  • 此时推荐使用Maven Helper这款IDEA插件,直接查看mall-admin项目是否存在依赖冲突,guava版本果然冲突了;

  • 通过观察可以发现minio这个依赖层级最浅,所以使用的是它的guava版本,直接排除掉即可;

<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><exclusions><exclusion><artifactId>guava</artifactId><groupId>com.google.guava</groupId></exclusion></exclusions>
</dependency>
  • 排除完成后发现guava的依赖冲突已经不见了,再次运行mall-admin项目,发现已经可以正常运行了;

  • 当我们访问Swagger文档时,又发现了一个问题,会报NumberFormatException异常;

java.lang.NumberFormatException: For input string: ""at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)at java.lang.Long.parseLong(Long.java:601)at java.lang.Long.valueOf(Long.java:803)at io.swagger.models.parameters.AbstractSerializableParameter.getExample(AbstractSerializableParameter.java:412)
  • 原因是当我们使用@ApiModelProperty注解时,作为Long数据类型,如果你不添加example属性,默认值是空字符串,空字符串转型自然就会报NumberFormatException异常;

/*** 修改订单费用信息参数* Created by macro on 2018/10/29.*/
@Getter
@Setter
public class OmsMoneyInfoParam {@ApiModelProperty(value = "订单ID",example = "1")private Long orderId;
}
  • 我们已经使用了很多@ApiModelProperty注解,要一个个添加那是不可能的,不过使用新版本的swagger-annotationsswagger-models依赖包就可以解决了,于是我们的Swagger依赖变成了下面这样的;

<dependencies><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><exclusions><exclusion><groupId>io.swagger</groupId><artifactId>swagger-annotations</artifactId></exclusion><exclusion><groupId>io.swagger</groupId><artifactId>swagger-models</artifactId></exclusion></exclusions></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId></dependency><!--解决Swagger 2.9.2版本NumberFormatException--><dependency><groupId>io.swagger</groupId><artifactId>swagger-models</artifactId><version>1.6.0</version></dependency><dependency><groupId>io.swagger</groupId><artifactId>swagger-annotations</artifactId><version>1.6.0</version></dependency>
</dependencies>
  • 再次运行mall-admin发现该问题已经解决了,我们在maven中一发现不合适的依赖就排除掉,然后引入合适版本的依赖,这样做真的好么?

  • 其实我们可以利用Maven项目的继承特性,直接在父项目中规定好依赖的版本,这样子项目的依赖版本就能统一了;

  • 先把原来pom.xml中排除guava和swagger的配置给去除了,然后修改根目录下的pom.xml文件,指定版本号;

<properties><swagger2.version>2.9.2</swagger2.version><swagger-models.version>1.6.0</swagger-models.version><swagger-annotations.version>1.6.0</swagger-annotations.version><guava.version>20.0</guava.version>
</properties>
  • 在父项目的依赖管理节点下添加需要统一管理的相关依赖,至此Swagger版本升级完成;

<dependencyManagement><dependencies><!--Swagger-UI API文档生产工具--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>${swagger2.version}</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>${swagger2.version}</version></dependency><!--解决Swagger 2.9.2版本NumberFormatException--><dependency><groupId>io.swagger</groupId><artifactId>swagger-models</artifactId><version>${swagger-models.version}</version></dependency><dependency><groupId>io.swagger</groupId><artifactId>swagger-annotations</artifactId><version>${swagger-annotations.version}</version></dependency><!--统一Guava版本防止冲突--><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>${guava.version}</version></dependency></dependencies>
</dependencyManagement>
  • 当我们配置好Token访问需要权限的接口时,会发现品牌、商品、商品分类下的接口有权限访问,其他提示无权限,那是因为我们使用了如下配置来配置需要登录认证的路径;

@Configuration
@EnableSwagger2
public class Swagger2Config {private List<SecurityContext> securityContexts() {//设置需要登录认证的路径List<SecurityContext> result = new ArrayList<>();result.add(getContextByPath("/brand/.*"));result.add(getContextByPath("/product/.*"));result.add(getContextByPath("/productCategory/.*"));return result;}
}
  • 修改为全部路径即可,这个和旧版有点不同,旧版访问所有接口都会在头信息中带Token,而新版只会对配置的路径带Token。

@Configuration
@EnableSwagger2
public class Swagger2Config {private List<SecurityContext> securityContexts() {//设置需要登录认证的路径List<SecurityContext> result = new ArrayList<>();result.add(getContextByPath("/*/.*"));return result;}
}

新老版本界面对比

Swagger升级到2.9.2版本后界面瞬间变得美观了,让我们对新老界面来个对比。

老版本

新版本

项目源码地址

https://github.com/macrozheng/mall

推荐阅读:

  • fastjson到底做错了什么?为什么会被频繁爆出漏洞?

  • 详解面试中常被问到的那些异常问题

  • 漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?

  • 想理解Java的IO,不要从操作系统开始说起的都是耍流氓...

喜欢我可以给我设为星标哦

好文章,我“在看”

给丝袜哥(Swagger)升级了新版本,没想到居然有这么多坑!相关推荐

  1. java丝袜_丝袜哥 --- swagger的使用

    一.是什么? swagger,俗称丝袜哥,是用来生成接口文档的.没有使用swagger的时候,你写完后端接口,得自己将后端接口地址一个个地整理出来,告诉别人这个接口是干嘛的,要传哪些参数,正常情况下返 ...

  2. 玩转 SpringBoot 2 快速整合 | 丝袜哥(Swagger)

    概述 首先让我引用 Swagger 官方的介绍: Design is the foundation of your API development. Swagger makes API design ...

  3. api响应泛型参数 swagger_你还在用丝袜哥(Swagger)?今天不如换换口味!

    今天给大家安利一款接口文档生成器--JApiDocs. Swagger想必大家都用过吧,非常方便,功能也十分强大.如果非要说Swaager有什么缺点,想必就是注解写起来比较麻烦.如果我说有一款不用写注 ...

  4. 车窗上为啥总有一些小黑点?没想到居然藏着大作用!

    全世界只有3.14 % 的人关注了 爆炸吧知识 经常坐车的人 可能会发现一个小细节 车窗边缘有一圈小黑点 好多人都以为这个厂家的贴纸 反正也不碍事就没去除它 其实,这些小黑点 确实有真正的科学用途 其 ...

  5. 分区起始位置参数溢出_机械硬盘在4k对齐时勾选了一个主分区,没想到居然提示起始位置参数溢出~后来我不想要这个主分区了重新...

    盘分区表错误.如果原来备份过分区表,恢复即可:如果没有: 1.用winpe启动电脑(光盘版/U盘版都行),运行diskgenuis修复分区表.即使没硬盘,winPE也可以启动电脑,所以,换个PE试试. ...

  6. 25岁竟要求产品经验10年?我一直以为是个段子,没想到居然是真的

    你是不是以为工作3年要求有10年工作经验是个段子? 今天告诉你这是真事儿! 25岁要求工作经验10年!!! 你好歹给人家工作5年的机会吧!这样也好说剩下的5年工作经验靠加班! HR这样说我没法接啊! ...

  7. 使用计算机有哪些违规操作,你在用的哪些APP含违法违规 没想到居然有它

    花火网消息,日常使用的APP最近接连被爆出有违法违规的操作情况,最近国家计算机病毒中心发布了<移动APP违法违规问题及治理举措>.其中APP和SDK存在的六大类问题,包括远程控制.恶意扣费 ...

  8. Swagger(丝袜哥) 快速入门(超详细介绍)

    swagger(丝袜哥) Swagger是一个简单但功能强大的API表达工具.它具有地球上最大的API工具生态系统,数以千计的开发人员,使用几乎所有的现代编程语言,都在支持和使用Swagger.使用S ...

  9. 什么是RESTful,SpringBoot怎么引入丝袜哥(Swagger)

    前言 最近在开发自己的博客系统,前端采用vue+nuxt,后端采用SpringBoot作为整体架构,所以用到一些实战的技巧就打算顺便写写文章. 1.了解RESTful 做为一个网络应用开发人,都晓得我 ...

最新文章

  1. Switcher ---Vista Areo 工具
  2. 十周第一次课(5月25日)
  3. php 回收周期(Collecting Cycles)
  4. java linkedlist 查找_Java中LinkedList真的是查找慢增删快
  5. 作文第一次用计算机350,第一次做饭的作文350字
  6. 针对于高频低频图像的理解
  7. 智睿学校网上评课系统 v8.8.4源码
  8. Raft -【go一致性算法】
  9. 安全是一个系统问题包括服务器安全,信息安全技术题库:除了应用程序功能,Web内容和功能枚举还需要关注( )。...
  10. [C11] 推荐系统(Recommender Systems)
  11. configure: error: cannot guess build type; you must specify one解决方法
  12. Tricks(三十一)—— 访问一个数组相邻的奇数位偶数位
  13. Spring(13)——PropertyPlaceholderConfigurer
  14. 数字图像处理冈萨雷斯版学习(二)
  15. 语文数学英语计算机文理科,高考文理科英语试卷一样吗
  16. 【数据结构】哈希(Hash)
  17. vue3.0之-watch全面解析
  18. 两种常用癌症免疫疗法CAR-T与TCR-T的联系和区别
  19. POI读取Excel转为HTML文件
  20. MATLAB函数——lowpass

热门文章

  1. excel怎么连接html文件夹,excel如何批量超链接到指定的文件夹,看完你就知道了...
  2. ICASSP 2023 | 解密实时通话中基于 AI 的一些语音增强技术
  3. javaScript系列 [02]-javaScript对象探析
  4. 乔布斯与比尔盖茨的传奇人生 两位天才的恩怨情仇
  5. java中查询db2的clob列,DB2 中读取clob类型
  6. sketch measure 导出html,Sketch measure 导出规范卡住的问题
  7. html怎么做动态切换效果,使用CSS制作一个比较炫酷的页面切换动画
  8. 基于three.js的3D炫酷元素周期表
  9. Java、JSP物业管理信息系统毕业设计
  10. 郭大侠与Rabi-Ribi (优先队列)