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. 手写“SpringBoot”近况:IoC模块已经完成

    jsoncat:https://github.com/Snailclimb/jsoncat (About 仿 Spring Boot 但不同于 Spring Boot 的一个轻量级的 HTTP 框架) ...

  2. 【题解】CF1207E XOR Guessing

    Link 这是一道交互题. \(\text{Solution:}\) 观察到猜的数范围只有\(2^{14}.\) 我第一次想到的方法是,我们可以确定系统选择的两个数的异或和,用这个异或和去穷举所有目标 ...

  3. Docker安装MongoDB、MySQL、Jenkins、Gitlab、Nginx

    Docker安装MongoDB.MySQL.Jenkins.Gitlab.Nginx 安装MongoDB 1. 拉取镜像 $ sudo docker pull mongo 2. 运行镜像 $ sudo ...

  4. Ubuntu18.04修改apt-get源

    1)备份源文件: sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 2)查看版本信息 如是Linux Mint等Ubuntu衍生版,执行: ...

  5. nginx完美支持thinkphp3.2.2(需配置URL_MODE=>3 rewrite兼容模式)

    来源:http://www.thinkphp.cn/topic/26637.html 环境:nginx 1.6,thinkphp3.2.2 第一步,修改server块 server { listen ...

  6. 初始python模块

    Python语言中,模块分为三类. 第一类:内置模块,也叫做标准库.此类模块就是python解释器给你提供的,比如我们之前见过的 time模块,os模块.标准库的模块非常多(200多个,每个模块又有很 ...

  7. C++单链表操作

    #include <stdio.h> typedef struct _Node{   int value;   _Node *next;}Node; void AddNodeTail(No ...

  8. Springboot+JPA下实现简易爬虫:豆瓣电视剧数据

    Springboot+JPA下实现简易爬虫:豆瓣电视剧数据 前言:今天听到产品那边讨论一些需求,好像其中一点是用户要求我们爬虫,在网页上抓取一些数据然后存到我们公司数据库中,众所周知,爬虫的实现对于p ...

  9. ASP.Net Core3.1 生成二维码填坑

    ASP.Net Core3.1 使用QrCode生成二维码 部署到Linux报错 The type initializer for 'System.DrawingCore.GDIPlus' threw ...

  10. pytest文档53-命令行实时输出错误信息(pytest-instafail)

    前言 pytest 运行全部用例的时候,在控制台会先显示用例的运行结果(.或F), 用例全部运行完成后最后把报错信息全部一起抛出到控制台. 这样我们每次都需要等用例运行结束,才知道为什么报错,不方便实 ...