SpringBoot整合Swagger2

相信各位在公司写API文档数量应该不少,当然如果你还处在自己一个人开发前后台的年代,当我没说,如今为了前后台更好的对接,还是为了以后交接方便,都有要求写API文档。

手写Api文档的几个痛点:

  1. 文档需要更新的时候,需要再次发送一份给前端,也就是文档更新交流不及时。
  2. 接口返回结果不明确
  3. 不能直接在线测试接口,通常需要使用工具,比如postman
  4. 接口文档太多,不好管理

Swagger也就是为了解决这个问题,当然也不能说Swagger就一定是完美的,当然也有缺点,最明显的就是代码移入性比较强。

其他的不多说,想要了解Swagger的,可以去Swagger官网,可以直接使用Swagger editor编写接口文档,当然我们这里讲解的是SpringBoot整合Swagger2,直接生成接口文档的方式。

添加pom依赖

  1. <dependency>
  2. <groupId>io.springfox</groupId>
  3. <artifactId>springfox-swagger2</artifactId>
  4. <version>2.6.1</version>
  5. </dependency>
  6.  
  7. <dependency>
  8. <groupId>io.springfox</groupId>
  9. <artifactId>springfox-swagger-ui</artifactId>
  10. <version>2.6.1</version>
  11. </dependency>

Swagger配置类

其实这个配置类,只要了解具体能配置哪些东西就好了,毕竟这个东西配置一次之后就不用再动了。 特别要注意的是里面配置了api文件也就是controller包的路径,不然生成的文档扫描不到接口。

  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import springfox.documentation.builders.ApiInfoBuilder;
  4. import springfox.documentation.builders.PathSelectors;
  5. import springfox.documentation.builders.RequestHandlerSelectors;
  6. import springfox.documentation.service.ApiInfo;
  7. import springfox.documentation.spi.DocumentationType;
  8. import springfox.documentation.spring.web.plugins.Docket;
  9.  
  10. /**
  11. * @author zh
  12. * @ClassName cn.saytime.Swgger2
  13. * @Description
  14. * @date 2017-07-10 22:12:31
  15. */
  16. @Configuration
  17. public class Swagger2 {
  18.  
  19. @Bean
  20. public Docket createRestApi() {
  21. return new Docket(DocumentationType.SWAGGER_2)
  22. .apiInfo(apiInfo())
  23. .select()
  24. .apis(RequestHandlerSelectors.basePackage("cn.saytime.web"))
  25. .paths(PathSelectors.any())
  26. .build();
  27. }
  28.  
  29. private ApiInfo apiInfo() {
  30. return new ApiInfoBuilder()
  31. .title("springboot利用swagger构建api文档")
  32. .description("简单优雅的restfull风格,https://www.cnblogs.com/fengyuduke")
  33. .termsOfServiceUrl("https://www.cnblogs.com/fengyuduke")
  34. .version("1.0")
  35. .build();
  36. }
  37. }

用@Configuration注解该类,等价于XML中配置beans;用@Bean标注方法等价于XML中配置bean。

启动类

  1. @SpringBootApplication
  2. @EnableSwagger2
  3. public class SpringbootSwagger2Application {
  4.  
  5. public static void main(String[] args) {
  6. SpringApplication.run(SpringbootSwagger2Application.class, args);
  7. }
  8. }

加上注解@EnableSwagger2 表示开启Swagger。

  1. import cn.saytime.bean.JsonResult;
  2. import cn.saytime.bean.User;
  3. import io.swagger.annotations.Api;
  4. import io.swagger.annotations.ApiImplicitParam;
  5. import io.swagger.annotations.ApiImplicitParams;
  6. import io.swagger.annotations.ApiOperation;
  7. import org.springframework.http.ResponseEntity;
  8. import org.springframework.web.bind.annotation.PathVariable;
  9. import org.springframework.web.bind.annotation.RequestBody;
  10. import org.springframework.web.bind.annotation.RequestMapping;
  11. import org.springframework.web.bind.annotation.RequestMethod;
  12. import org.springframework.web.bind.annotation.RestController;
  13. import springfox.documentation.annotations.ApiIgnore;
  14.  
  15. import java.util.ArrayList;
  16. import java.util.Collections;
  17. import java.util.HashMap;
  18. import java.util.List;
  19. import java.util.Map;
  20.  
  21. /**
  22. * @author zh
  23. * @ClassName cn.saytime.web.UserController
  24. * @Description
  25. */
  26. @RestController
  27. public class UserController {
  28.  
  29. // 创建线程安全的Map
  30. static Map<Integer, User> users = Collections.synchronizedMap(new HashMap<Integer, User>());
  31.  
  32. /**
  33. * 根据ID查询用户
  34. * @param id
  35. * @return
  36. */
  37. @ApiOperation(value="获取用户详细信息", notes="根据url的id来获取用户详细信息")
  38. @ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Integer", paramType = "path")
  39. @RequestMapping(value = "user/{id}", method = RequestMethod.GET)
  40. public ResponseEntity<JsonResult> getUserById (@PathVariable(value = "id") Integer id){
  41. JsonResult r = new JsonResult();
  42. try {
  43. User user = users.get(id);
  44. r.setResult(user);
  45. r.setStatus("ok");
  46. } catch (Exception e) {
  47. r.setResult(e.getClass().getName() + ":" + e.getMessage());
  48. r.setStatus("error");
  49. e.printStackTrace();
  50. }
  51. return ResponseEntity.ok(r);
  52. }
  53.  
  54. /**
  55. * 查询用户列表
  56. * @return
  57. */
  58. @ApiOperation(value="获取用户列表", notes="获取用户列表")
  59. @RequestMapping(value = "users", method = RequestMethod.GET)
  60. public ResponseEntity<JsonResult> getUserList (){
  61. JsonResult r = new JsonResult();
  62. try {
  63. List<User> userList = new ArrayList<User>(users.values());
  64. r.setResult(userList);
  65. r.setStatus("ok");
  66. } catch (Exception e) {
  67. r.setResult(e.getClass().getName() + ":" + e.getMessage());
  68. r.setStatus("error");
  69. e.printStackTrace();
  70. }
  71. return ResponseEntity.ok(r);
  72. }
  73.  
  74. /**
  75. * 添加用户
  76. * @param user
  77. * @return
  78. */
  79. @ApiOperation(value="创建用户", notes="根据User对象创建用户")
  80. @ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")
  81. @RequestMapping(value = "user", method = RequestMethod.POST)
  82. public ResponseEntity<JsonResult> add (@RequestBody User user){
  83. JsonResult r = new JsonResult();
  84. try {
  85. users.put(user.getId(), user);
  86. r.setResult(user.getId());
  87. r.setStatus("ok");
  88. } catch (Exception e) {
  89. r.setResult(e.getClass().getName() + ":" + e.getMessage());
  90. r.setStatus("error");
  91.  
  92. e.printStackTrace();
  93. }
  94. return ResponseEntity.ok(r);
  95. }
  96.  
  97. /**
  98. * 根据id删除用户
  99. * @param id
  100. * @return
  101. */
  102. @ApiOperation(value="删除用户", notes="根据url的id来指定删除用户")
  103. @ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long", paramType = "path")
  104. @RequestMapping(value = "user/{id}", method = RequestMethod.DELETE)
  105. public ResponseEntity<JsonResult> delete (@PathVariable(value = "id") Integer id){
  106. JsonResult r = new JsonResult();
  107. try {
  108. users.remove(id);
  109. r.setResult(id);
  110. r.setStatus("ok");
  111. } catch (Exception e) {
  112. r.setResult(e.getClass().getName() + ":" + e.getMessage());
  113. r.setStatus("error");
  114.  
  115. e.printStackTrace();
  116. }
  117. return ResponseEntity.ok(r);
  118. }
  119.  
  120. /**
  121. * 根据id修改用户信息
  122. * @param user
  123. * @return
  124. */
  125. @ApiOperation(value="更新信息", notes="根据url的id来指定更新用户信息")
  126. @ApiImplicitParams({
  127. @ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long",paramType = "path"),
  128. @ApiImplicitParam(name = "user", value = "用户实体user", required = true, dataType = "User")
  129. })
  130. @RequestMapping(value = "user/{id}", method = RequestMethod.PUT)
  131. public ResponseEntity<JsonResult> update (@PathVariable("id") Integer id, @RequestBody User user){
  132. JsonResult r = new JsonResult();
  133. try {
  134. User u = users.get(id);
  135. u.setUsername(user.getUsername());
  136. u.setAge(user.getAge());
  137. users.put(id, u);
  138. r.setResult(u);
  139. r.setStatus("ok");
  140. } catch (Exception e) {
  141. r.setResult(e.getClass().getName() + ":" + e.getMessage());
  142. r.setStatus("error");
  143.  
  144. e.printStackTrace();
  145. }
  146. return ResponseEntity.ok(r);
  147. }
  148.  
  149. @ApiIgnore//使用该注解忽略这个API
  150. @RequestMapping(value = "/hi", method = RequestMethod.GET)
  151. public String jsonTest() {
  152. return " hi you!";
  153. }
  154. }

启动SpringBoot项目,访问 http://localhost:8080/swagger-ui.html

Swagger注解

swagger通过注解表明该接口会生成文档,包括接口名、请求方法、参数、返回信息的等等。

  • @Api:修饰整个类,描述Controller的作用
  • @ApiOperation:描述一个类的一个方法,或者说一个接口
  • @ApiParam:单个参数描述
  • @ApiModel:用对象来接收参数
  • @ApiProperty:用对象接收参数时,描述对象的一个字段
  • @ApiResponse:HTTP响应其中1个描述
  • @ApiResponses:HTTP响应整体描述
  • @ApiIgnore:使用该注解忽略这个API
  • @ApiError :发生错误返回的信息
  • @ApiImplicitParam:一个请求参数
  • @ApiImplicitParams:多个请求参数

springboot(十六)-swagger2的更多相关文章

  1. SpringBoot(十六)_springboot整合JasperReport6.6.0

    现在项目上要求实现套打,结果公司里有个人建议用JaperReport进行实现,就进入这个东西的坑中.好歹经过挣扎现在已经脱离此坑中.现在我也是仅能实现读取数据库数据转成pdf进行展示,包括中文的展示. ...

  2. SpringBoot(十六):SpringBoot2.1.1集成fastjson,并使用fastjson替代默认的MappingJackson

    springboot2.1.1默认采用的json converter是MappingJackson,通过调试springboot项目中代码可以确定这点.在springboot项目中定义WebMvcCo ...

  3. springboot(十六):使用Jenkins部署Spring Boot

    jenkins是devops神器,本篇文章介绍如何安装和使用jenkins部署Spring Boot项目 jenkins搭建 部署分为三个步骤: 第一步,jenkins安装 第二步,插件安装和配置 第 ...

  4. springboot(十六):springboot整合shiro

    数据库有五张表(userInfo,uerrole,role,rolepermission,permission) userInfo(id,username,password) userrole(uid ...

  5. SpringBoot | 第二十六章:邮件发送

    前言 讲解了日志相关的知识点后.今天来点相对简单的,一般上,我们在开发一些注册功能.发送验证码或者订单服务时,都会通过短信或者邮件的方式通知消费者,注册或者订单的相关信息.而且基本上邮件的内容都是模版 ...

  6. springboot(十四):springboot整合shiro-登录认证和权限管理(转)

    springboot(十四):springboot整合shiro-登录认证和权限管理 .embody{ padding:10px 10px 10px; margin:0 -20px; border-b ...

  7. 跟我学SpringCloud | 第十六篇:微服务利剑之APM平台(二)Pinpoint

    目录 SpringCloud系列教程 | 第十六篇:微服务利剑之APM平台(二)Pinpoint 1. Pinpoint概述 2. Pinpoint主要特性 3. Pinpoint优势 4. Pinp ...

  8. Spring Boot 2.X(十六):应用监控之 Spring Boot Actuator 使用及配置

    Actuator 简介 Actuator 是 Spring Boot 提供的对应用系统的自省和监控功能.通过 Actuator,可以使用数据化的指标去度量应用的运行情况,比如查看服务器的磁盘.内存.C ...

  9. spring-boot-route(十六)使用logback生产日志文件

    日志是一个系统非常重要的一部分,我们经常需要通过查看日志来定位问题,今天我们一起来学习一下Spring Boot的日志系统.有很多同学习惯性的在生产代码中使用System.out来输出日志,这是不推荐 ...

随机推荐

  1. Asp.Net WebAPI 通过HttpContextBase或者HttpRquest 获取请求参数

    WEBAPI中的Request是HttpRequestMessage类型,不能像Web传统那样有querystring和from 方法接收参数,而传统的HttpReqest的基类是HttpReqest ...

  2. windows10下如何完全卸载串口驱动?

    答: 所需步骤如下: 1. 以管理员身份启动cmd 2. 在cmd中输入两行命令来启动设备管理器 3. 设置view->Show hidden devices 4. 在Ports (COM &a ...

  3. 原来项目更换svn地址

    近期公司由于旧地址装修,临时更换办公地址:同时相应的网络地址也更换了.我们开发项目的svn地址根目录也得改变.所以怎么解决呢? 1.找到项目根文件夹: 右键:

  4. javascript之DOM(Document Object Model) 文档对象模型

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  5. MVC和MVP区别

    从这幅图可以看到,我们可以看到在MVC里,View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑. 在MVC模型里,更关注的Model的不变,而同时有 ...

  6. WPF Slider Tickbar 中显示数值

    class CustomTickBar : TickBar { protected override void OnRender(System.Windows.Media.DrawingContext ...

  7. 2019.12.04 ADT on eclipse 配置篇

    今天看JerryWang的简书博客https://www.jianshu.com/p/74ad8e4bbc49 ,SAP GUI 和ADT是互为补充的关系,有很多SAP新出的技术都没有办法在GUI上开 ...

  8. padding的计算方法

    转自https://blog.csdn.net/qq_34599526/article/details/83755275 VALID:如果卷积核超出特征层,就不再就计算,即卷积核右边界不超出Featu ...

  9. C++ vector的详细用法

    vector容器类型 vector容器是一个模板类,可以存放任何类型的对象(但必须是同一类对象).vector对象可以在运行时高效地添加元素,并且vector中元素是连续存储的.vector的构造 函 ...

  10. 从gopath到go mod的一次尝试

    windows下的尝试: gomod初尝试下载官方包1.11(及其以上版本将会自动支持gomod) 默认GO111MODULE=auto(auto是指如果在gopath下不启用mod)go mod h ...