使用springfox生成springmvc项目的swagger的文档
介绍
Swagger
Swagger
是用来描述和文档化RESTful API的一个项目。Swagger Spec是一套规范,定义了该如何去描述一个RESTful API
。类似的项目还有RAML
、API Blueprint
。 根据Swagger Spec
来描述RESTful API的文件称之为Swagger specification file
,它使用JSON来表述,也支持作为JSON支持的YAML。
Swagger specification file
可以用来给swagger-ui生成一个Web的可交互的文档页面,以可以用swagger2markup生成静态文档,也可用使用swagger-codegen生成客户端代码。总之有了有个描述API的JSON文档之后,可以做各种扩展。
Swagger specification file
可以手动编写,swagger-editor为了手动编写的工具提供了预览的功能。但是实际写起来也是非常麻烦的,同时还得保持代码和文档的两边同步。于是针对各种语言的各种框架都有一些开源的实现来辅助自动生成这个`Swagger specification file
。
swagger-core
是一个Java的实现,现在支持JAX-RS
。swagger-annotation
定义了一套注解给用户用来描述API。spring-fox
也是一个Java的实现,它支持Spring MVC
, 它也支持swagger-annotation
定义的部分注解。
使用Springfox
Docket
Springfox通过定义Docket
对象来全局的定义API的一些属性。同时支持swagger-annotation
的部分注解来定义各个API方法一些参数等。
看一个定义的例子
|
|
- 定义了需要生成API文档的endpoint,api()方法可以通过
RequestHandlerSelectors
的各种选择器来选择,比如说选择所有注解了@RsestController
的类中的所有API e.g..apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
。path()方法可以通过PathSelectors
的来匹配路径,提供了regex
匹配或者ant
匹配 - 定义了API的根路径
- 输出模型定义时的替换,比如遇到所有
LocalDate
的字段时,输出成String
- 遇到对应泛型类型的外围类,直接解析成泛型类型,比如说
ResponseEntity<T>
,应该直接输出成类型T - 提供了自定义性更强的针对泛型的处理,示例中的代码的意思是将类型DeferredResult
>直接解析成类型T - 是否使用默认的ResponseMessage, 框架默认定义了一些针对各个HTTP方法时各种不同响应值对应的message
- 全局的定义ResponseMessage,示例代码定义GET方法的500错误的消息以及错误模型。注意这里GET方法的所有ResponseMessage都会被这里的定义覆盖
- 定义API支持的SecurityScheme,指的是认证方式,支持OAuth、APIkey。 P.S. 要让swagger-ui的oauth正常工作,需要定义个
SecurityConfiguration
的Bean - 定义具体上下文路径对应的认证方式
- 还有一些接口可以定义API的名称等一些基本信息,定义API支持的数据格式等等。
注解
还有一些swagger-annotation
的注解可以帮助我们针对各个API生成更为详细的文档
- @ApiOperation 描述方法名称,描述
- @ApiResponses 描述方法发生异常时返回的code以及message
- @ApiImplicitParams 显示的描述方法的参数,默认情况下springfox会根据参数的
@RequestParam
、@PathParam
等注解来自动获取参数。 但是如果没有注解则会识别为request body
。 方法的一些参数是由容器注入的,并不是客户端的参数。使用@ApiIgnore
来忽略。
一些坑
###swagger-ui的o2c.hmtl找不到
2.0.4版本之前,Oauth2认证返回的redirectUri为/o2c.html
,但是o2c.html在webjar里面,实际路径是/webjars/springfox-swagger-ui/o2c.html
,具体参考
###swagger-ui的oauth认证弹出框失效
2.0.4版本之前存在的问题,之前提到了需要在容易中定义一个SecurityConfiguration
的Bean,因为swagger-ui.html
会在初始化的时候请求这个Bean,访问返回对象中的几个属性,然后初始Oauth的一些JS代码。如果后台返回的JSON的property名不是驼峰式命名的,那这几个属性就不能正确获取到,导出初始化失败,具体参考
静态文档
静态文档可以通过Swagger2MarkupResultHandler
执行生成asciidoc或者SwaggerResultHandler
生成swagger.json
,再使用swagger2markup-gradle-plugin
根据swagger.json
生成asciidoc,ResultHandler的使用要配合Spring Test Framework
。
最后使用asciidoctor-gradle-plugin
合并asciidoc并生成html