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整合的更多相关文章

  1. 系列文章:老项目的#iPhone6与iPhone6Plus适配#(持续更新中,更新日期2014年10月12日 星期日 )

    本文永久地址为http://www.cnblogs.com/ChenYilong/p/4020399.html ,转载请注明出处. ********************************** ...

  2. 老项目的#iPhone6与iPhone6Plus适配#LaunchImage适配

    本文永久地址为 http://www.cnblogs.com/ChenYilong/p/4020384.html,转载请注明出处.  Evernote印象笔记链接:https://www.everno ...

  3. 老项目的#iPhone6与iPhone6Plus适配#Icon适配

        本文永久地址为http://www.cnblogs.com/ChenYilong/p/4020373.html ,转载请注明出处.  这是Evernote印象笔记的链接:https://www ...

  4. 老项目的#iPhone6与iPhone6Plus适配#iOS8无法开启定位问题和#解决方案#

    本文永久地址为 http://www.cnblogs.com/ChenYilong/p/4020359.html,转载请注明出处. iOS8的定位和推送的访问都发生了变化, 下面是iOS7和iOS8申 ...

  5. 老项目的#iPhone6于iPhone6Plus适配#iPhone6分辨率与适配

    技术博客http://www.cnblogs.com/ChenYilong/    本文永久地址为http://www.cnblogs.com/ChenYilong/p/4011744.html ,转 ...

  6. Ocelot网关统一查看多个微服务asp.net core项目的swagger API接口

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 一.准备 前提需要下载安装consul,项目需要懂添加swagger 统一在网关中配置多个微服务的swagger,需要用到服务注册 ...

  7. 学习笔记——Maven实战(三)多模块项目的POM重构

    重复,还是重复 程序员应该有狗一般的嗅觉,要能嗅到重复这一最常见的坏味道,不管重复披着怎样的外衣,一旦发现,都应该毫不留情地彻底地将其干掉.不要因为POM不是产品代码而纵容重复在这里发酵,例如这样一段 ...

  8. Maven实战(三)——多模块项目的POM重构

    在本专栏的上一篇文章POM重构之增还是删中.我们讨论了一些简单有用的POM重构技巧,包含重构的前提--持续集成,以及怎样通过加入或者删除内容来提高POM的可读性和构建的稳定性.但在实际的项目中,这些技 ...

  9. 谈谈软件项目的dependency

    说到软件项目的依赖管理,可以从三个方面来考虑: 一.由build system控制的dependency 现在的build system,都支持一定程度上的dependency management, ...

随机推荐

  1. burp suite 之 Scanner(漏洞扫描)

    Scanner选项:是一个进行自动发现 web 应用程序的安全漏洞的工具. 将抓取的包 通过选项卡发送至 Scanner下的Scan queue 首先来介绍 Scanner 下的 lssue acti ...

  2. spring多模块之间的调用

    https://blog.csdn.net/tomcat_2014/article/details/50206197?locationNum=5

  3. 基于GAN的特征抽取 Feature Extraction by GAN

    InfoGAN 期望的是 input 的每一个维度都能表示输出数据的某种特征.但实际改变输入的一个特定维度取值,很难发现输出数据随之改变的规律. InfoGAN 就是想解决这个问题.在 GAN 结构以 ...

  4. 中部:执具 | R语言数据分析(北京邮电大学)自整理笔记

    第5章工欲善其事.必先利其器 代码,是延伸我们思想最好的工具. 第6章基础编程--用别人的包和函数讲述自己的故事 6.1编程环境 1.R语言的三段论 大前提:计算机语言程序=算法+数据结构 小前提:R ...

  5. 题解【[USACO18FEB]New Barns 】

    浅谈一下对于这题做完之后的感受(不看题解也是敲不出来啊qwq--) 题意翻译 Farmer John注意到他的奶牛们如果被关得太紧就容易吵架,所以他想开放一些新的牛棚来分散她们. 每当FJ建造一个新牛 ...

  6. 看动画学算法之:linkedList

    目录 简介 linkedList的构建 linkedList的操作 头部插入 尾部插入 中间插入 删除节点 简介 linkedList应该是一种非常非常简单的数据结构了.节点一个一个的连接起来,就成了 ...

  7. C# 读取路径的各种方式

    //1.获取模块的完整路径. string path1 = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; // ...

  8. vue+elmentUI项目的正则判断

    一.为了方便重复利用管理,我创建一个regExp.ts文件来管理正则的表达式,内容如下: 1 /* eslint-disable */ 2 const phoneNumberRegExp = /^[1 ...

  9. 你知道CPU结构也会影响Redis性能吗?

    啦啦啦,我是卖身不卖艺的二哈,ε=(´ο`*)))唉错啦(我是开车的二哈),我又来了,铁子们一起开车呀! 今天来分析下CPU结构对Redis性能会有影响吗? 在进行Redis性能分析的时候,通常我们会 ...

  10. java高级项目 jdbc与数据库连接数据库

    //图书管类 public class Book { private Integer id; private String b_name; private double b_price; privat ...