给丝袜哥(Swagger)升级了新版本,没想到居然有这么多坑!
看着项目中古老的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-annotations
和swagger-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)升级了新版本,没想到居然有这么多坑!相关推荐
- java丝袜_丝袜哥 --- swagger的使用
一.是什么? swagger,俗称丝袜哥,是用来生成接口文档的.没有使用swagger的时候,你写完后端接口,得自己将后端接口地址一个个地整理出来,告诉别人这个接口是干嘛的,要传哪些参数,正常情况下返 ...
- 玩转 SpringBoot 2 快速整合 | 丝袜哥(Swagger)
概述 首先让我引用 Swagger 官方的介绍: Design is the foundation of your API development. Swagger makes API design ...
- api响应泛型参数 swagger_你还在用丝袜哥(Swagger)?今天不如换换口味!
今天给大家安利一款接口文档生成器--JApiDocs. Swagger想必大家都用过吧,非常方便,功能也十分强大.如果非要说Swaager有什么缺点,想必就是注解写起来比较麻烦.如果我说有一款不用写注 ...
- 车窗上为啥总有一些小黑点?没想到居然藏着大作用!
全世界只有3.14 % 的人关注了 爆炸吧知识 经常坐车的人 可能会发现一个小细节 车窗边缘有一圈小黑点 好多人都以为这个厂家的贴纸 反正也不碍事就没去除它 其实,这些小黑点 确实有真正的科学用途 其 ...
- 分区起始位置参数溢出_机械硬盘在4k对齐时勾选了一个主分区,没想到居然提示起始位置参数溢出~后来我不想要这个主分区了重新...
盘分区表错误.如果原来备份过分区表,恢复即可:如果没有: 1.用winpe启动电脑(光盘版/U盘版都行),运行diskgenuis修复分区表.即使没硬盘,winPE也可以启动电脑,所以,换个PE试试. ...
- 25岁竟要求产品经验10年?我一直以为是个段子,没想到居然是真的
你是不是以为工作3年要求有10年工作经验是个段子? 今天告诉你这是真事儿! 25岁要求工作经验10年!!! 你好歹给人家工作5年的机会吧!这样也好说剩下的5年工作经验靠加班! HR这样说我没法接啊! ...
- 使用计算机有哪些违规操作,你在用的哪些APP含违法违规 没想到居然有它
花火网消息,日常使用的APP最近接连被爆出有违法违规的操作情况,最近国家计算机病毒中心发布了<移动APP违法违规问题及治理举措>.其中APP和SDK存在的六大类问题,包括远程控制.恶意扣费 ...
- Swagger(丝袜哥) 快速入门(超详细介绍)
swagger(丝袜哥) Swagger是一个简单但功能强大的API表达工具.它具有地球上最大的API工具生态系统,数以千计的开发人员,使用几乎所有的现代编程语言,都在支持和使用Swagger.使用S ...
- 什么是RESTful,SpringBoot怎么引入丝袜哥(Swagger)
前言 最近在开发自己的博客系统,前端采用vue+nuxt,后端采用SpringBoot作为整体架构,所以用到一些实战的技巧就打算顺便写写文章. 1.了解RESTful 做为一个网络应用开发人,都晓得我 ...
最新文章
- Switcher ---Vista Areo 工具
- 十周第一次课(5月25日)
- php 回收周期(Collecting Cycles)
- java linkedlist 查找_Java中LinkedList真的是查找慢增删快
- 作文第一次用计算机350,第一次做饭的作文350字
- 针对于高频低频图像的理解
- 智睿学校网上评课系统 v8.8.4源码
- Raft -【go一致性算法】
- 安全是一个系统问题包括服务器安全,信息安全技术题库:除了应用程序功能,Web内容和功能枚举还需要关注( )。...
- [C11] 推荐系统(Recommender Systems)
- configure: error: cannot guess build type; you must specify one解决方法
- Tricks(三十一)—— 访问一个数组相邻的奇数位偶数位
- Spring(13)——PropertyPlaceholderConfigurer
- 数字图像处理冈萨雷斯版学习(二)
- 语文数学英语计算机文理科,高考文理科英语试卷一样吗
- 【数据结构】哈希(Hash)
- vue3.0之-watch全面解析
- 两种常用癌症免疫疗法CAR-T与TCR-T的联系和区别
- POI读取Excel转为HTML文件
- MATLAB函数——lowpass
热门文章
- excel怎么连接html文件夹,excel如何批量超链接到指定的文件夹,看完你就知道了...
- ICASSP 2023 | 解密实时通话中基于 AI 的一些语音增强技术
- javaScript系列 [02]-javaScript对象探析
- 乔布斯与比尔盖茨的传奇人生 两位天才的恩怨情仇
- java中查询db2的clob列,DB2 中读取clob类型
- sketch measure 导出html,Sketch measure 导出规范卡住的问题
- html怎么做动态切换效果,使用CSS制作一个比较炫酷的页面切换动画
- 基于three.js的3D炫酷元素周期表
- Java、JSP物业管理信息系统毕业设计
- 郭大侠与Rabi-Ribi (优先队列)