【实战】记一次老项目的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, ...
随机推荐
- idea如何通过数据库生成实体类
---恢复内容开始--- https://blog.csdn.net/liu_yulong/article/details/72910588 ---恢复内容结束---
- Java基础——缓存
1.缓存 将程序或系统中常用的数据对象存储在像内存这样特定的介质中,以避免在每次程序调用时,重新创建或组织数据所带来的性能损耗,从而提高了系统的整体运行速度 以目前的系统架构来说,用户的请求一般会先经 ...
- Spring 配置文件配置事务
一.引入事务的头文件 xmlns:tx="http://www.springframework.org/schema/tx" http://www.springframework. ...
- list_for_eacy_entry图解
.
- Web开发初探之JavaScript 快速入门
本文改编和学习自 A JavaScript Primer For Meteor 和 MDN Web教程 前文 Web开发初探 概述 本文以介绍 JavaScript 为主,初学者掌握本文的内容后,将能 ...
- IdentityServer4系列 | 初识基础知识点
前言 我们现在日常生活中,会使用各式各样的应用程序,层出不穷,其中有基于网页浏览方式的应用,有基于手机端的App,甚至有基于流行的公众号和小程序等等,这些应用,我们不仅要实现各个应用的功能之外,还要考 ...
- 达梦产品技术支持培训-day2-DM8常用SQL
(本文只作为随笔或个人笔记,非官方文档,请勿作他用,谢谢) DM8数据库的SQL兼容性很高,和Oracle差距不大,以下是个人认为比较关键的部分. 1.关键动词 create --新建 drop -- ...
- Thinkphp中D方法和M方法的区别
两者共同点都是实例化模型的,而两者不同点呢?一起来看一下: $User = D('User');括号中的参数User,对应的模型类文件的 \Home\Model\UserModel.class.php ...
- golang拾遗:指针和接口
这是本系列的第一篇文章,golang拾遗主要是用来记录一些遗忘了的.平时从没注意过的golang相关知识.想做本系列的契机其实是因为疫情闲着在家无聊,网上冲浪的时候发现了zhuihu上的go语言爱好者 ...
- 持续集成工具之Jenkins安装部署
一.DevOps理念 所谓DevOps是指development和Operations的组合,中文意思就是开发和运维的简写.devops理念主要是针对企业中的研发人员.运维人员和测试人员的工作理念,是 ...