SpringBoot2.x整合Swagger2 实现API文档实时生成

我们提供Restful接口的时候,API文档是尤为的重要,它承载着对接口的定义,描述等,本文主要介绍了SpringBoot集成Swagger2生成接口文档的方法示例,需要的朋友们下面随着小编来一起学习学习吧

我们提供Restful接口的时候,API文档是尤为的重要,它承载着对接口的定义,描述等。它还是和API消费方沟通的重要工具。在实际情况中由于接口和文档存放的位置不同,我们很难及时的去维护文档。个人在实际的工作中就遇到过很多接口更新了很久,但是文档却还是老版本的情况,其实在这个时候这份文档就已经失去了它存在的意义。而 Swagger 是目前我见过的最好的API文档生成工具,使用起来也很方便,还可以直接调试我们的API。我们今天就来看下 Swagger2 与 SpringBoot 的结合。

文章目录

  • 一、SpringBoot工程创建
  • 二、工程配置
    • 2.1. pom依赖配置
    • 2.2. Swagger2配置
  • 三、创建接口
  • 四、创建实体类
  • 五、Swagger2 APL介绍
  • 六、页面效果
  • 七、API验证测试
    • 7.1. 获取用户列表接口
    • 7.2. 创建用户
    • 7.3. 根据用户id,获取用户详细信息
    • 7.4. 根据用户id,更新用户详细信息
    • 7.5. 根据用户id,删除用户信息

一、SpringBoot工程创建

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

二、工程配置

2.1. pom依赖配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.9.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.gblfy</groupId><artifactId>springboot-swagger2</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot-swagger2</name><description>Spring Boot整合Swagger2</description><properties><!--编码设置--><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><!--JDK版本--><java.version>1.8</java.version></properties><dependencies><!--Spring Boot整合Swagger2 Start--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency><!--Spring Boot整合Swagger2 End--><!--Springmvc 启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--生成get/set等--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version></dependency><!--单元测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><!--maven编译打包插件--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2.2. Swagger2配置

  • 提供一个Docket的Bean即可
package com.gblfy.springbootswagger2.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;/*** @author gblfy* @ClassNme SwaggerConfig* @Description SwaggerConfig 配置bean类* @Date 2019/11/5 20:19* @version1.0*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {/*** 创建一个Docket对象* 调用select()方法,* 生成ApiSelectorBuilder对象实例,该对象负责定义外漏的API入口* 通过使用RequestHandlerSelectors和PathSelectors来提供Predicate,在此我们使用any()方法,将所有API都通过Swagger进行文档管理** @return*/@Beanpublic Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).pathMapping("/").select().apis(RequestHandlerSelectors.basePackage("com.gblfy.springbootswagger2")).paths(PathSelectors.any()).build().apiInfo(new ApiInfoBuilder()//标题.title("SpringBoot2.x整合Swagger2 构建api文档")//简介.description("简单优雅的restfun风格,详细信息......")//版本.version("9.0")//作者个人信息.contact(new Contact("技术论坛", "https://gblfy.com", "gblfy@gmail.com")).license("The Apache License")//服务条款.licenseUrl("https://gblfy.com").build());}
}

这里提供一个配置类,首先通过@EnableSwagger2注解启用Swagger2,然后配置一个Docket Bean,这个Bean中,配置映射路径和要扫描的接口的位置,在apiInfo中,主要配置一下Swagger2文档网站的信息,例如网站的title,网站的描述,联系人的信息,使用的协议等等。

如此,Swagger2就算配置成功了,非常方便。

此时启动项目,输入http://localhost:8080/swagger-ui.html,能够看到如下页面,说明已经配置成功了:
在这里插入图片描述

三、创建接口

接下来就是创建接口了,Swagger2相关的注解其实并不多,而且很容易懂,下面我来分别向小伙伴们举例说明:

package com.gblfy.springbootswagger2.controller;import com.gblfy.springbootswagger2.entity.User;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;import java.util.*;/*** @author gblfy* @ClassNme UserController* @Description 用户管理接口* @Date 2019/11/5 20:26* @version 1.0*/
@Api(tags = "用户管理相关接口")
@RestController
@RequestMapping(value = "/user")
public class UserController {// 创建线程安全的Map 用户封装用户数据public static Map<Long, User> userList = Collections.synchronizedMap(new HashMap<Long, User>());/*** 获取用户列表 封装公用** @return*/@ApiOperation(value = "获取用户列表", notes = "这里填写接口方法描述")@GetMapping("/list")public List<User> getUserList() {// 处理"/userList/"的GET请求,用来获取用户列表// 还可以通过@RequestParam从页面中传递参数来进行查询条件或者翻页信息的传递List<User> users = new ArrayList<User>(userList.values());return users;}/*** 创建用户** @param user* @return*/@ApiOperation(value = "创建用户", notes = "根据User对象创建用户")@ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")@PostMapping("/")public String postUser(@RequestBody User user) {// 处理"/userList/"的POST请求,用来创建User// 除了@ModelAttribute绑定参数之外,还可以通过@RequestParam从页面中传递参数userList.put(user.getId(), user);return "success";}/*** 根据用户id,获取用户详细信息** @param id* @return*/@ApiOperation(value = "获取用户详细信息", notes = "根据url的id来获取用户详细信息")@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long")@GetMapping(value = "/{id}")public User getUser(@PathVariable Long id) {// 处理"/userList/{id}"的GET请求,用来获取url中id值的User信息// url中的id可通过@PathVariable绑定到函数的参数中return userList.get(id);}/*** 根据用户id,更新用户详细信息** @param id* @param user* @return*/@ApiOperation(value = "更新用户详细信息", notes = "根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息")@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long"),@ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")})@PutMapping(value = "/{id}")public String putUser(@PathVariable Long id, @ModelAttribute User user) {// 处理"/userList/{id}"的PUT请求,用来更新User信息User u = userList.get(id);u.setUserName(user.getUserName());u.setAge(user.getAge());userList.put(id, u);return "success";}/*** 根据用户id,删除用户信息** @param id* @return*/@ApiOperation(value = "删除用户", notes = "根据url的id来指定删除对象")@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long")@DeleteMapping(value = "/{id}")public String deleteUser(@PathVariable Long id) {// 处理"/userList/{id}"的DELETE请求,用来删除UseruserList.remove(id);return "success";}
}

四、创建实体类

package com.gblfy.springbootswagger2.entity;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @author gblfy* @ClassNme User* @Description TODO* @Date 2019/11/5 20:31* @version1.0*/
@ApiModel
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User {@ApiModelProperty(value = "用户id")private long id;@ApiModelProperty(value = "用户名")private String userName;@ApiModelProperty(value = "用户年龄")private Integer age;
}

五、Swagger2 APL介绍

注解说明
@Api用来标记当前Controller的功能
@ApiOperation用来标记一个方法的作用
@ApiImplicitParam用来描述一个参数,可以配置参数的中文含义,也可以给参数设置默认值,这样在接口测试的时候可以避免手动输入,@ApiImplicitParam注解中虽然可以指定参数是必填的,但是却不能代替
@ApiImplicitParams如果有多个参数,则需要使用多个@ApiImplicitParam注解来描述,多个@ApiImplicitParam注解需要放在一个@ApiImplicitParams注解中
@RequestParam(required = true),前者的必填只是在Swagger2框架内必填,抛弃了Swagger2,这个限制就没用了,所以假如开发者需要指定一个参数必填,@RequestParam(required = true)注解还是不能省略
@ApiModel如果参数是一个对象(例如上文的更新接口),对于参数的描述也可以放在实体类中
@ApiModelProperty用户成员变量中

六、页面效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、API验证测试

操作:技巧 2步走
【Try it out】-【Execute】

7.1. 获取用户列表接口

在这里插入图片描述
在这里插入图片描述
用户信息为空

7.2. 创建用户

在这里插入图片描述在这里插入图片描述
添加用户成功
在调用一次,查询用户列表接口
在这里插入图片描述

7.3. 根据用户id,获取用户详细信息

在这里插入图片描述在这里插入图片描述

7.4. 根据用户id,更新用户详细信息

在这里插入图片描述在这里插入图片描述
更新用户信息后,再次调用获取用户列表接口
在这里插入图片描述
在这里插入图片描述

7.5. 根据用户id,删除用户信息

在这里插入图片描述
在这里插入图片描述
删除用户信息后,再次调用获取用户列表接口
在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云 ESS 弹性伸缩服务新功能来袭,更全面、更自动化的使用体验

摘要&#xff1a; 2017年9月阿里云弹性伸缩服务伸缩配置新增了实例自定义数据、秘钥对、实例RAM角色、标签新特性&#xff1b;近日&#xff0c;阿里云又发布了VSWitchIds.N多可用区新特性。 点此查看原文&#xff1a;http://click.aliyun.com/m/40810/ 弹性伸缩是一种根据业务需…

java 提取轮廓_TensorFlow 卷积操作模拟sobel算子提取图像轮廓

注意&#xff1a;sobel算子不保证结果在0-255&#xff0c;需要做一次归一化处理&#xff0c;再乘以255输出的数据shape与图像的shape不一样&#xff0c;需要一次转化效果代码import matplotlib.pyplot as plt # plt 用于显示图片import matplotlib.image as mpimg # mpimg 用于…

阿里云MaxCompute(大数据)公开数据集---带你玩转人工智能

摘要&#xff1a; 目前阿里云大数据产品已经免费向全部用户开放了多种公用数据集。开放的数据类别包括&#xff1a;股票价格数据&#xff0c;房产信息&#xff0c;影视及其票房数据。 点此查看原文&#xff1a;http://click.aliyun.com/m/40813/ 目前阿里云MaxCompute大数据产品…

豪投10亿!华为放话:3年培养100万AI人才!网友神回应了

近期&#xff0c;AI测试权威软件AI Benchmark的测试数据显示&#xff0c;中国华为研发的7nm旗舰手机芯片麒麟810的AI分数&#xff0c;远远超过美国高通骁龙855了&#xff01;麒麟810芯片AI分数是3300多&#xff0c;名列第一。而骁龙855手机则是2700多。大家振奋的同时&#xff…

阿里云大数据利器Maxcompute学习之-假如你使用过hive

摘要&#xff1a; 如果您是一个大数据开发工程师并且使用过hadoop的hive框架&#xff0c;那么恭喜您&#xff0c;阿里云的大数据计算服务-Maxcompute&#xff0c;您已经会了90%。这篇文章就来简单对比下Maxcompute和hive的异同&#xff0c;来方便刚开始使用Maxcompute的用户&am…

阿里云大数据利器Maxcompute-使用mapjoin优化查询

摘要&#xff1a; small is beautiful&#xff0c;small is powerful 点此查看原文&#xff1a;http://click.aliyun.com/m/40815/ 大数据计算服务&#xff08;MaxCompute&#xff0c;原名 ODPS&#xff09;是一种快速、完全托管的 GB/TB/PB 级数据仓库解决方案。 https://help…

GitHub下载文件时缓慢的问题

用记事本打开hosts文件&#xff0c;路径为 C:\Windows\System32\drivers\etc将下面3行添加到hosts文件中 140.82.114.3 github.com151.101.185.194 github.global.ssl.fastly.net192.30.253.121 codeload.github.com以管理员身份运行CMD&#xff0c;执行命令ipconfig /flushdn…

阿里云大数据利器之-RDS迁移到Maxcompute实现动态分区

摘要&#xff1a; 当前&#xff0c;很多用户的业务数据存放在传统关系型数据库上&#xff0c;例如阿里云的RDS&#xff0c;做业务读写操作。当数据量非常大的时候&#xff0c;此时传系关系型数据库会显得有些吃力&#xff0c;那么会经常有将mysql数据库的数据迁移到[大数据处理…

SaaS前世今生:老树开新花

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 文东海出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcould&#xff09;2019年3月26日&#xff0c;Adobe和微软宣布&#xff0c;两家公司准备展开一项合作&#xff0c;来提升双方的“销售和营销软件”的能力&#xff0c;进…

初体验-阿里云短视频 SDK For Android 快速接入

摘要&#xff1a; 近期的一些创意短视频 App 风靡年轻群体&#xff0c;比较典型的例如抖音、MUSE 等&#xff0c;阿里云也适时地推出了简单易用的短视频 SDK&#xff0c;帮助开发者们以较低的成本快速引入功能完备的创意短视频功能。本文主要介绍如何快速接入阿里云短视频 SDK …

解决Chrome插件安装时出现的“程序包无效”问题

https://blog.csdn.net/ysq5202121/article/details/50809494

【 CDN 最佳实践】CDN 命中率优化思路

摘要&#xff1a; CDN 在静态资源的加速场景中是将静态资源缓存在距离客户端较近的CDN 节点上&#xff0c;然后客户端访问该资源即可通过较短的链路直接从缓存中获取资源&#xff0c;而避免再通过较长的链路回源获取静态资源。因此 CDN的缓存命中率的高低直接影响客户体验&…

首帧秒开+智能鉴黄+直播答题,阿里云直播系统背后技术大起底

摘要&#xff1a; 想要快速实现直播能力&#xff0c;并对原有业务不产生任何影响&#xff0c;依托如阿里云一样的直播平台&#xff0c;来搭建移动直播系统&#xff0c;将技术难题交给阿里云&#xff0c;把更多的精力放在核心业务的本身&#xff0c;是最为稳妥和高效的选择。本文…

《云栖社区2017年度内容特辑》新鲜出炉!800+份大会PPT、20+技术专题、100+话题...快抱走!...

回首2017&#xff0c;云栖社区承载了太多的精彩内容&#xff0c;这一年大量的优秀团队入驻社区&#xff0c;600博主成为云栖专家&#xff0c;他们为读者奉献了无数精彩的内容——100W博文&#xff0c;300场直播&#xff0c;用户互动问答数超过6W&#xff1b;与此同时&#xff0…

K8S精华问答 | K8S 是什么?不是什么?

kubernetes&#xff0c;简称K8S&#xff0c;是用8代替8个字符“ubernete”而成的缩写。是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;Kubernetes的目标是让部署容器化的应用简单并且高效&#xff08;powerful&#xff09;,Kubernetes提供了应…

FaaS如何在云2.0时代发挥优势,又将走向何方?

摘要&#xff1a; 过去十年&#xff0c;云服务深刻地改变了社会获取和使用计算能力的方式&#xff0c;云服务自身也以极快的速度演进。在基础设施云化之后&#xff0c;容器、Serverless等技术迅猛发展&#xff0c;开始推动业务能力的云化&#xff0c;云计算进入2.0时代。 点此查…

解锁新姿势 | 如何用配置中心实现全局动态流控?

摘要&#xff1a; 当资源成为瓶颈时&#xff0c;服务框架需要对消费者做限流&#xff0c;启动流控保护机制。流量控制有多种策略&#xff0c;比较常用的有&#xff1a;针对访问速率的静态流控、针对资源占用的动态流控、针对消费者并发连接数的连接控制和针对并行访问数的并发控…

53K!拿下阿里Python岗,这些技术点全考了!

Python又上热搜了&#xff01;”&#xff0c;最近笔者在逛脉脉时&#xff0c;发现这样的一条信息&#xff1a;看完后&#xff0c;我相信大家和我一样&#xff0c;what&#xff0c;Python这么时候值钱了&#xff1f;本篇文章&#xff0c;我将帮大家搞定两大疑问&#xff1a;1. P…

用WEB技术栈开发NATIVE应用:WEEX SDK原理详解

摘要&#xff1a; WEEX依旧采取传统的web开发技术栈进行开发&#xff0c;同时app在终端的运行体验不输native app。其同时解决了开发效率、发版速度以及用户体验三个核心问题。那么WEEX是如何实现的&#xff1f;目前WEEX已经完全开源&#xff0c;并捐给Apache基金会&#xff0c…

什么是java枚举_什么是java枚举

什么是java枚举&#xff1f;java 枚举的定义与用法一、枚举的定义&#xff1a;枚举是一种特殊的数据类型&#xff0c;之所以特殊是因为它既是一种类(class)类型却又比类型多了些特殊的约束&#xff0c;但是这些约束的存在也造就了枚举类型的简洁&#xff0c;安全性以及便捷性。…