【实战】记一次老项目的swagger整合
1.背景
这两天接到一个整合swagger的任务,本以为很简单,预计两小时内完成,没想到其中有太多的坑,整了两天才完成。
首先项目是一个比较老的项目,之前用的servlet,目前在重构为springmvc。所以有一部分servlet,一部分springmvc。spring配置方面也有很多不规范的地方,这也为我后面踩坑埋下伏笔。
2.坑坑
2.1 spring版本
项目用的spring版本为4.3.1,在引入springfox-swagger2和springfox-swagger-ui后项目启动报错。原因是springfox-swagger2在集成的时候,已经引入了spring的相关jar,且与项目中的spring版本不一致,导致了冲突,需要排除掉swagger中的spring依赖
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.4.0</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.4.0</version>
</dependency>
2.2 web.xml
加swagger依赖,加swagger配置,加swagger注解后。启动,访问http://xxxx:8080/platform_web/swagger-ui.html#/ ,页面空白,F12...404了
说明请求没有被转发。去web.xml看一眼dispatcherservlet怎么配的,发现url-pattern是.do。额,没有匹配呀,那我自己写吧。总不能把人家的改成/吧
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
<!-- 为swagger配置额外的pattern-->
<url-pattern>/v2/api-docs</url-pattern>
<url-pattern>/v2/api-docs-ext</url-pattern>
<url-pattern>/configuration/security</url-pattern>
<url-pattern>/configuration/ui</url-pattern>
<url-pattern>/swagger-resources</url-pattern>
<url-pattern>/swagger-resources/configuration/security</url-pattern>
<url-pattern>/swagger-resources/configuration/ui</url-pattern>
</servlet-mapping>
2.3 spring配置,springmvc配置(配置不规范,重构两行泪)
再启动,文档描述出来了,但接口还没有内容...F12看请求资源,全是200,所以不是资源请求的问题。但是我swagger请求中配置了扫描包,包里的类也加上了swagger注释了呀。.apis(RequestHandlerSelectors.basePackage("work")) //扫描的包。说明没扫描到包或者说没拿到包中的依赖。看一下spring配置文件,确实配置了,spring容器肯定有这些bean。springmvc配置文件中并没有包扫描的配置。严格的说controller应该注册在springmvc容器中,但在spring容器中也不是不可以呀,spirng和springmvc是父子容器的关系,springmvc应该能正常的拿到spring容器中的bean呀。百度大法后,发现swagger好像比较傲娇,它只从springmvc容器中拿bean...好吧,那我把controller的bean调整到springmvc容器吧,同时移除掉spring容器中的controller(注意:swaggerconfig也应该注册在springmvc容器中)
(1)spring
<!--排除掉swagger和controller-->
<context:component-scan base-package="work,core,projectcore">
<context:exclude-filter type="regex" expression="work.actionv.*" />
<context:exclude-filter type="assignable" expression="swaggerConfig.SwaggerConfig"/>
</context:component-scan>
(2)springmvc
<!--注入controller-->
<context:component-scan base-package="work" use-default-filters="false">
<context:include-filter type="regex" expression="work.actionv.*"/>
</context:component-scan>
<!--SwaggerConfig配置类注入-->
<bean id="swaggerConfig" class="swaggerConfig.SwaggerConfig"/>
2.4 只显示一个接口(google大法好)
重启,接口列表出来了,但只有一个接口是什么鬼,我明明每个方法上都有注解啊。观察代码,发现由于每个mapping的url都相同,只是通过参数method来区分的

百度后得知swagger(openapi)的数据结构就是 path -> method -> operation ,没有通过参数区分的方式,所以多个url相同时只展示一条,也只有零星的几个帖子提到这个情况,而且大家一致认为没有什么好的解决方案。但我还不服气,google了一下发现了一种解决方案:docket配置enableUrlTemplating,[Springfox not generating different swagger entries for operations with same base path, but one endpoint has query parameters]

【实战】记一次老项目的swagger整合的更多相关文章
- 系列文章:老项目的#iPhone6与iPhone6Plus适配#(持续更新中,更新日期2014年10月12日 星期日 )
本文永久地址为http://www.cnblogs.com/ChenYilong/p/4020399.html ,转载请注明出处. ********************************** ...
- 老项目的#iPhone6与iPhone6Plus适配#LaunchImage适配
本文永久地址为 http://www.cnblogs.com/ChenYilong/p/4020384.html,转载请注明出处. Evernote印象笔记链接:https://www.everno ...
- 老项目的#iPhone6与iPhone6Plus适配#Icon适配
本文永久地址为http://www.cnblogs.com/ChenYilong/p/4020373.html ,转载请注明出处. 这是Evernote印象笔记的链接:https://www ...
- 老项目的#iPhone6与iPhone6Plus适配#iOS8无法开启定位问题和#解决方案#
本文永久地址为 http://www.cnblogs.com/ChenYilong/p/4020359.html,转载请注明出处. iOS8的定位和推送的访问都发生了变化, 下面是iOS7和iOS8申 ...
- 老项目的#iPhone6于iPhone6Plus适配#iPhone6分辨率与适配
技术博客http://www.cnblogs.com/ChenYilong/ 本文永久地址为http://www.cnblogs.com/ChenYilong/p/4011744.html ,转 ...
- Ocelot网关统一查看多个微服务asp.net core项目的swagger API接口
0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 一.准备 前提需要下载安装consul,项目需要懂添加swagger 统一在网关中配置多个微服务的swagger,需要用到服务注册 ...
- 学习笔记——Maven实战(三)多模块项目的POM重构
重复,还是重复 程序员应该有狗一般的嗅觉,要能嗅到重复这一最常见的坏味道,不管重复披着怎样的外衣,一旦发现,都应该毫不留情地彻底地将其干掉.不要因为POM不是产品代码而纵容重复在这里发酵,例如这样一段 ...
- Maven实战(三)——多模块项目的POM重构
在本专栏的上一篇文章POM重构之增还是删中.我们讨论了一些简单有用的POM重构技巧,包含重构的前提--持续集成,以及怎样通过加入或者删除内容来提高POM的可读性和构建的稳定性.但在实际的项目中,这些技 ...
- 谈谈软件项目的dependency
说到软件项目的依赖管理,可以从三个方面来考虑: 一.由build system控制的dependency 现在的build system,都支持一定程度上的dependency management, ...
随机推荐
- 码云+Git配置仓库
版本库Git安装 概述 Git是一个开源的分布式控制系统,可以有效高速的处理从很小的到非常大的项目版本管理,是目前使用范围最广的版本管理工具. 下载安装 下载后傻瓜式一键安装,建议安装在英文目录下,安 ...
- python中不需要函数重载的原因
函数重载主要是为了解决两个问题: 1.可变参数类型 2.可变参数个数 并且函数重载一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函 ...
- 1.UiPath账密安全保存常见方法
今天在写流程的时候突然用到密码保存,看到同事不同项目中所用到的方法不同,就看了一下别的同学博客,总结的特别好,自己跟着实操了一遍,受益匪浅. RPA适合于登录不同的系统代替人工操作,而登录系统时难免要 ...
- 手把手教你springboot中导出数据到excel中
手把手教你springboot中导出数据到excel中 问题来源: 前一段时间公司的项目有个导出数据的需求,要求能够实现全部导出也可以多选批量导出(虽然不是我负责的,我自己研究了研究),我们的项目是x ...
- c#RSA的SHA1加密与AES加密、解密
前言:公司项目对接了一个对数据保密性要求较高的java公司.api接口逻辑是这样的:他们提供 SHA1私钥 与 AES的秘钥.我们需要将 传递查询参数 通过SHA1 私钥加密再转换成 十六进制 字符串 ...
- js简单数据类型和复杂数据类型
var timer = null; //简单数据类型null 返回的是一个空的对象 object console.log(typeof timer); 1.简单数据类型 在内存中存放在栈中,在里面开 ...
- 这一次,彻底理解JavaScript深拷贝
导语 这一次,通过本文彻底理解JavaScript深拷贝! 阅读本文前可以先思考三个问题: JS世界里,数据是如何存储的? 深拷贝和浅拷贝的区别是什么? 如何写出一个真正合格的深拷贝? 本文会一步步解 ...
- 08 . Jenkins之SpringCloud微服务+Vue+Docker持续集成
简介 大致流程 /* 1.开发人员每天把代码提交到Gitlab代码仓库 2.jenkins从gitlab中拉取项目源码,编译并打包成war包,然后构建Docker镜像,将镜像上传到Harbor私有仓库 ...
- 大话Python类语义
类 物以类聚,人以群分,就是相同特征的人和事物会自动聚集在一起,核心驱动点就是具有相同特征或相类似的特征,我们把具有相同特征或相似特征的事物放在一起,被称为分类,把分类依据的特征称为类属性 计算机中分 ...
- HttpReports 2.0 发布了 !!!
前言介绍 HttpReports 是基于.Net Core 开发的APM监控系统,使用MIT开源协议,主要功能包括,统计, 分析, 可视化, 监控,追踪等,适合在微服务环境中使用. Github地址: ...