基于SpringMVC 3.22的swagger配置避坑(durcframework)

虽然现在的项目基本都是用最新的版本,但是难免有些老项目还是使用了古老的版本。本文对SpringMVC 3.22版本的swagger配置进行了记录,希望能够帮助你跨越这些远古的坑。

Swagger : THE WORLD'S MOST POPULAR API FRAMEWORK

使用项目: http://git.oschina.net/durcframework/emptyProject

介绍:基于SpringMVC3.2.2 的封装框架durcframework

Swagger是Restfulf风格项目开发必不可少的工具,现在最新的是Swagger2,Swagger2的配置可以说是相当简单了。但是因为团队使用的基础项目是基于SpringMVC 3.2.2的权限管理系统所以碰到了很多坑。废话不多说,配置过程如下:

  1. 在pom.xml中添加依赖:

     <!-- swagger API document -->
     <dependency>
         <groupId>com.mangofactory</groupId>
         <artifactId>swagger-springmvc</artifactId>
         <version>0.6.5</version>
     </dependency>
    
  2. springMVC.xml(平时的SpringMVC项目中为xx-sevlet.xml)中添加如下配置:

     <!--swagger-->
     <mvc:annotation-driven />
     <context:component-scan base-package="app.controller" /><!--需要扫描的包-->
     <context:property-placeholder location="classpath:/swagger.properties" />
     <bean id="documentationConfig" class="com.mangofactory.swagger.configuration.DocumentationConfig" />
     <context:annotation-config />
     <mvc:default-servlet-handler />
    
  3. classpth(mvn项目的classpathsrc/main/resources)下添加swagger.properties文件,写入如下配置:

     documentation.services.version=1.0
     documentation.services.basePath=http://localhost:8088/yourProjName/api-docs
    

    注意,这边有个巨大的坑:此处的basePath在Swagger0.6.5中必须在后面加上api-docs,要不然会报错。

  4. 因为是权限管理系统,所以很多访问是有权限问题的,为了避免权限问题引发swagger无法正常运行,需在web.xml中进行如下配置:

     <servlet-mapping>
         <servlet-name>dispatcherServlet</servlet-name>
         <url-pattern>/api-docs/*</url-pattern>
     </servlet-mapping>
    

    到此部为止,已经可以通过json返回API信息了。访问http://localhost:8088/yourProjName/api-docs会返回类似下面的内容:

     {"apiVersion":"1.0","apis":[{"path":"/api-docs/api/swagger"}{"path":"/api-docs/r-sys-res-controller"},{"path":"/api-docs/r-user-controller"},{"path":"/api-docs/r-user-role-controller"},{"path":"/api-docs/sch-role-controller"},{"path":"/api-docs/system-controller"}],"basePath":"http://localhost:8088/MedicalMaster/api-docs","swaggerVersion":"1.0"}
    

    返回的json是对应的controller进一步得到相应文档的地址,我们可以在原地址上加上上面的任意一个地址,如:http://localhost:8088/yourProjName/api-docs/api-docs/api/swagger,将得到类似下面的具体json:

     {"apiVersion":"1.0","apis":
     [{"description":"","operations":[{"deprecated":false,"httpMethod":"GET","nickname":"queryAPIInfo","notes":"","responseClass":"any","summary":"query api basic information"}],"path":"/api/swagger/info.do"},
     {"description":"","operations":[{"deprecated":false,"httpMethod":"GET","nickname":"queryData","notes":"","parameters":[{"allowMultiple":false,"dataType":"String","defaultValue":"","description":"words","name":"words","notes":"","paramType":"query","required":true}],"responseClass":"any","summary":"query data with parameters"}],"path":"/api/swagger/data.do"}],
     "basePath":"http://localhost:8088/MedicalMaster/api-docs","models":{},"resourcePath":"/api/swagger","swaggerVersion":"1.0"}
    
  5. 现在,我们来配置图形化界面。图形化界面的原理只是去调用这个json接口,将数据可视化而已。因为此处使用的是swagger0.6.5所以需要手动添加swagger前端页面。

    • 首先,从https://github.com/swagger-api/swagger-ui下载最新的swagger-ui,在webapp下新建swagger目录,将下载下来的项目的dist文件夹下所有的文件拷贝到swagger下。

    • 修改swagger/index.html中的url:

        原url:url = "http://petstore.swagger.io/v2/swagger.json";
        修改为:url = "http://localhost:8088/yourProjName/";
      
  6. 重启项目。如果不是权限管理系统的话,那么可以直接访问http://localhost:8088/yourProjName/swagger/index.html就能看到效果。如果是权限管理系统,那么就先登陆任意账号,然后再访问即可。效果图如下:



遇到的坑

  1. 因为使用的基于SpringMVC 3.2.2durcframework框架开发的权限管理系统,所以首先是无法使用swagger2 和swagger1.x只是用swagger0.6.5。如果使用的是swagger会报无法注入对象的错误,原因是springMVC3和springMVC4的差别。

  2. 与框架开发分责任交流后,尝试手动更改durcframework中的springMVC版本,更改后可以使用,但是由于更改的是从maven repository pull下来的文件内的pom.xml,如果是多人协作的话需要自己创建自己的maven repository,太过麻烦。另一个办法是直接更改自己的pom.xml文件,强行覆盖,但是会造成更多奇怪的问题,因为原来的权限管理系统是基于SpringMVC3开发的,会有很多代码层面上的问题。所以最后更改SpringMVC版本的尝试失败,只能够选择低的swagger版本。

  3. 权限问题是另外一个头疼的问题。因为权限的原因,无法直接访问swagger起的服务,比如http://localhost:8088/yourProjName/api-docs就直接无法访问,原因是拦截器把它给拦截了。需要在web.xml里面配置拦截器,自动忽略api-docs/*匹配的动作。

    由于上述问题,直接导致笔者将swagger的调用机制研究了一遍。但是现在的swagger2的配置的确是十分简单,建议能够选择的时候尽量只用最新版本的springMVC。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容