笔者目前正在搭建一套API服务框架,考虑到客户端可以更方便的调用API服务(这里说的更方即是指避免不厌其烦地解说各接口须要的参数和返回结果),因而决心为每一个接口生成详细的说明文档。网上搜索了一下,发现了Swagger这个东西,感受不错,界面也比javadoc生成的页面要美观,并且网上关于Swagger和springmvc整合的文章很多(遗憾的是大多雷同且不完整)。本文详细介绍Swagger和SpringMVC的整合过程,重点是弥补现有文章的遗漏之处(很关键的哦!)。让咱们一块儿来学习如何使用Swagger来生成接口文档吧!php
既然是整合Swagger,那么前提是你已经使用SpringMVC搭建了一套接口服务
,不管繁简,只要可用就行。关于接口文档生成工具,你们在网上搜索的时候,可能会发现另一个工具:springfox。网上关于springfox和spring整合的文章也很是多的呀。那springfox和swagger是什么关系呢?引用springfox官方的语录:html
Springfox has evolved from a project originally created by Marty Pitt and was named swagger-springmvc.
这段英文很简单,不懂的读者对照在线词典也能够翻译出来,加油!言归正传,先简单介绍下项目环境:java
在整合以前,须要把全部使用到的依赖包所有引入。网上不少文章只是简单告诉读者引入swagger-springmvc-1.0.2.jar包,可是随后你发现这远远不够,还须要不少包,
以下所示:git
<!-- swagger-springmvc --> <dependency> <groupId>com.mangofactory</groupId> <artifactId>swagger-springmvc</artifactId> <version>1.0.2</version> </dependency> <dependency> <groupId>com.mangofactory</groupId> <artifactId>swagger-models</artifactId> <version>1.0.2</version> </dependency> <dependency> <groupId>com.wordnik</groupId> <artifactId>swagger-annotations</artifactId> <version>1.3.11</version> </dependency> <!-- swagger-springmvc dependencies --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>15.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.4.4</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.4.4</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.4.4</version> </dependency> <dependency> <groupId>com.fasterxml</groupId> <artifactId>classmate</artifactId> <version>1.1.0</version> </dependency>
以上是比较完整的依赖列表,本文搭建的项目能够正常运行。读者可能会有疑问,maven管理的依赖包不是具备传递性吗?是的,是有传递性,可是传递性是根据<scope>
来界定的。打开swagger-springmvc依赖包的pom文件能够发现,其不少依赖包的scope值为compile或者provider,不会根据传递性自动引入。github
Swagger的配置实际上就是自定义一个Config类,经过java编码的方式实现配置。代码以下:web
import com.mangofactory.swagger.configuration.SpringSwaggerConfig; import com.mangofactory.swagger.models.dto.ApiInfo; import com.mangofactory.swagger.plugin.EnableSwagger; import com.mangofactory.swagger.plugin.SwaggerSpringMvcPlugin; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * Created by xiaohui on 2016/1/14. */ @Configuration @EnableSwagger public class SwaggerConfig { private SpringSwaggerConfig springSwaggerConfig; /** * Required to autowire SpringSwaggerConfig */ @Autowired public void setSpringSwaggerConfig(SpringSwaggerConfig springSwaggerConfig) { this.springSwaggerConfig = springSwaggerConfig; } /** * Every SwaggerSpringMvcPlugin bean is picked up by the swagger-mvc * framework - allowing for multiple swagger groups i.e. same code base * multiple swagger resource listings. */ @Bean public SwaggerSpringMvcPlugin customImplementation() { return new SwaggerSpringMvcPlugin(this.springSwaggerConfig) .apiInfo(apiInfo()) .includePatterns(".*?"); } private ApiInfo apiInfo() { ApiInfo apiInfo = new ApiInfo( "My Apps API Title", "My Apps API Description", "My Apps API terms of service", "My Apps API Contact Email", "My Apps API Licence Type", "My Apps API License URL"); return apiInfo; } }
上面这段代码是从网络上找到的,你也确定找到了,对吧!可是,你会发现一个问题:SpringSwaggerConfig没法注入。
这是为何呢?其实很简单,由于spring容器里没有SpringSwaggerConfig类型的对象。解决办法:在springmvc的配置文件中加入如下配置便可。spring
<bean class="com.mangofactory.swagger.configuration.SpringSwaggerConfig" />
到目前为止,咱们已经完成了对全部接口方法的扫描解析功能,那解析获得什么内容呢?这须要咱们自定义,自定义操做的对象就是接口方法。先看段代码:json
/** * 根据用户名获取用户对象 * @param name * @return */ @RequestMapping(value="/name/{name}", method = RequestMethod.GET) @ResponseBody @ApiOperation(value = "根据用户名获取用户对象", httpMethod = "GET", response = ApiResult.class, notes = "根据用户名获取用户对象") public ApiResult getUserByName(@ApiParam(required = true, name = "name", value = "用户名") @PathVariable String name) throws Exception{ UcUser ucUser = ucUserManager.getUserByName(name); if(ucUser != null) { ApiResult<UcUser> result = new ApiResult<UcUser>(); result.setCode(ResultCode.SUCCESS.getCode()); result.setData(ucUser); return result; } else { throw new BusinessException("根据{name=" + name + "}获取不到UcUser对象"); } }
上述代码是Controller中的一个方法,@ApiOperation注解对这个方法进行了说明,@ApiParam注解对方法参数进行了说明。关于这两个注解的使用,能够参看源码。这样子,Swagger就能够扫描接口方法,获得咱们自定义的接口说明内容。api
Swagger扫描解析获得的是一个json文档,对于用户不太友好。下面介绍swagger-ui,它可以友好的展现解析获得的接口说明内容。浏览器
从https://github.com/swagger-api/swagger-ui 获取其全部的 dist 目录下东西放到须要集成的项目里,本文放入 src/main/webapp/WEB-INF/swagger/ 目录下。
修改swagger/index.html文件,默认是从链接http://petstore.swagger.io/v2/swagger.json获取 API 的 JSON,这里须要将url值修改成http://{ip}:{port}/{projectName}/api-docs的形式,{}中的值根据自身状况填写。好比个人url值为:http://localhost:8083/arrow-api/api-docs
由于swagger-ui项目都是静态资源,restful形式的拦截方法会将静态资源进行拦截处理,因此在springmvc配置文件中须要配置对静态文件的处理方式。
//全部swagger目录的访问,直接访问location指定的目录 <mvc:resources mapping="/swagger/**" location="/WEB-INF/swagger/"/>
OK!大功告成,打开浏览器直接访问swagger目录下的index.html文件,便可看到接口文档说明了。注意访问地址哦!看下图:
文章做者:xiaohui249
本文连接:http://javatech.wang/index.php/archives/74/ 版本全部 ©转载时必须以连接形式注明做者和原始出处