前面写过一篇如何建立 一个最基础的 Spring 4 MVC Maven 项目 ,现在是要在此基础上使用 SpringFox 来生成 Swagger 文档以及 SwaggerUI。Swagger 2 是基于 OpenAPI3.0 的实现,SpringFox 是用于在 Spring 项目中生成 Swagger 文档及 UI, 主要包括两个组件 springfox-swagger2
和 springfox-swagger-ui
。
本文是基于普通的 Spring MVC 项目的实例,而非针对 SpringBoot 项目,实际运用应该大同小异,无外乎 SpringBoot 中有许多自动配置项。并且本文也不涉及到 Swagger 众多注解的具体用法,具体请查看源代码或相关文档。
开始本文的示例,首先需要搭建起 Spring MVC 项目,具体做法请参考 一个最基础的 Spring 4 MVC Maven 项目 。
对应于两个组件 springfox-swagger2
和 springfox-swaager-ui
的应用,从大尺度上讲有两方面的内容,分别是
使用第一个组件 springfox-swagger2
能够让项目运行期自动生成 Swagger 2 的 JSON API 文档,分两步走
在项目的 pom.xml 文件中加入依赖配置
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.8.0</version> </dependency>
截止目前,springfox 官方已释放出 springfox-swagger2:2.9.0, 但是在 Maven 的中央仓库中只有 2.8.0 版,所就采用 2.8.0 版本
如今多用 Java 代码作为 Spring 的配置,在 Java Config 中类上面加上注解 @EnableSwagger2, 如下
@EnableWebMvc @EnableSwagger2 @ComponentScan(basePackages= "controller") public class WebAppConfig { }
假设项目中已创建有 UserController,并且应用的上下文是 "swagger-test", 这时候用 mvn tomcat7:run
启动 Tomcat,我们就可以访问 URL http://localhost:8080/swagger-test/v2/api-docs
这就是一个符合 OpenAPI3 的 Swagger2 的 API 描述文档,我们可以通过第三方的 SwaggerUI 来引入该文档进行展示,比如官方的 SwaggerUI 可以从这里下载 https://swagger.io/download-swagger-ui/ 。
如果是多个系统的 API 描述文件要集中一个中心 UI 去显示的话,那么我们让 springfox-swagger2 在运行期产生 /v2/api-docs
内容就足够了。
要是仍然觉得要更多担当,当前应用中还想把 SwaggerUI 也托管起来的话,我们还有 springfox-swagger-ui 值得一试,就是接下来的任务
这里要用到第二个组件 springfox-swagger-ui
, 当然 springfox-swagger2
是它的前提。这个 SwaggerUI 不仅漂亮的归类显示了所有的 API, 关键它还非常实用,你可以通过该 UI 发送实实在在的 HTTP 请求,对每一个 API 进行在线测试,这是非开发人员喜爱的功能。
有两个步骤
在 pom.xml 文件中加上
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.8.0</version> </dependency>
同样的原因,采用 2.8.0 版本
/swagger-ui.html
页面 为了使得 /swagger-ui.html
页面有效,必须完善前面的 WebAppConfig
配置类,完整代码如下
@EnableWebMvc @EnableSwagger2 // v2/api-docs @ComponentScan(basePackages = {"controller"}) public class WebAppConfig extends WebMvcConfigurerAdapter { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder().title("RESTful API document").version("2.0") .contact(new Contact("Yanbin", "http://localhost:8080/", "fantasia@sina.com")).build(); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); } }
其中上面加亮的方法 addResourceHandlers(...)
将会激活 /swagger-ui.html
页面。其余两个方法只是润色 Swagger JSON 文件内容的,是可选的,当然也会展示在 UI 上的。
为了让 /swagger-ui.html
获得更诱人的显示效果,将创建两个 Controller 类 -- UserController 和 OrderController。由于本例重点不在代码本身,因而以图片方式显示代码
有了这两个 Controller 类,以及足够覆盖常见的 HTTP method 之后,再来浏览一下 http://localhost:8080/swagger-ui.html
非常写意的不同颜色表现了 HTTP 的各种不同操作的准确含义。想当年我还是在没听说过 Swagger 的情况下在网络上千辛万苦找啊找,记录了这篇 如果要给 RESTful 每种 HTTP Method 类型指示一种颜色 。2014 年写的,这算是与 Swagger 的首回合交上运。对比前后两张图,现在的颜色比之从前更显圆润了。
上面的 swagger-ui, 点击每一个条目,可以展开,可以看到参数的具体描述,样例,填入参数,发送请求,可以看到完整的请求响应数据。另外关于 Swagger 的注解,如 @Api, @ApiImplicitParam, @ApiModel, @ApiOperation, @ApiParam, @ApiResponse, @Tag 等不在本文讨论之列。
链接: