Spring Boot集成Springfox Swagger3和简单应用
摘要:Springfox Swagger可以动态生成 API 接口供前后端进行交互和在线调试接口,Spring Boot 框架是目前非常流行的微服务框架,所以,在Spring Boot 项目中集成Springfox非常有意义。介绍Spring Boot集成Springfox Swagger3及swagger的简单应用。
§前言
Swagger是什么?官方说法:Swagger是一个规范和完整的框架,用于创建、描述、调试和可视化 RESTful 风格的 Web 服务。通俗地说,Swagger 是一个主要用来在线创建文档的插件,主要用来高质量地动态生成 API 接口供前后端进行交互和在线调试接口,如果不生成的话就需要写静态文档来交互,那样不仅速度慢而且不容易修改。发现了痛点就要寻找解决方案,故Swagger应运而生。
Springfox Swagger是Spring 基于swagger规范,可以将基于SpringMVC和Spring Boot项目的源码自动生成JSON格式的描述文件。本身不是属于Swagger官网提供的。Spring Boot 框架是目前非常流行的微服务框架,所以,在Spring Boot 项目中集成Springfox非常有意义,可以保证及时更新API文档,降低前后端沟通成本,提高系统迭代效率。
本文所用软件开发环境如下:
java version 13.0.1
IntelliJ IDEA 2019.3.2 (Ultimate Edition)
Spring Boot 2.3.1.RELEASE
§Spring Boot 集成 Springfox Swagger3
若想为Spring Boot项目添加无需任何配置的springfox,需引入其maven依赖库:
<!--集成 springfox swagger3 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
为了便于管理API文档,建议编写一个Swagger配置类,这里的配置类如下:
import org.springframework.beans.factory.annotation.Value;
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.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
/**
* Swagger 配置类
*
* @author Wiener
* @date 2021/2/26
*/
@EnableOpenApi
@Configuration
public class SwaggerConfig {
//读取application.properties 文件设置的是否开启swagger属性,正式环境一般需要关闭
@Value(value = "${swagger.enabled}")
Boolean swaggerEnabled;
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30).apiInfo(apiInfo())
// 是否开启swagger
.enable(swaggerEnabled).select()
// 过滤条件,扫描指定路径下的文件
.apis(RequestHandlerSelectors.basePackage("com.eg.wiener.controller"))
//只保留/user/*风格的路径,大家可以调试一下
// .paths(PathSelectors.ant("/user/*"))
// 指定路径处理,PathSelectors.any()代表不过滤任何路径
.paths(PathSelectors.any())
.build().pathMapping("/");
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Spring Boot集成Springfox Swagger示例")
.description("楼兰胡杨")
// 开发者信息
.contact(new Contact("楼兰胡杨", "https://www.cnblogs.com/east7/", "wienerXXX@163.com"))
.version("1.0.0")
.build();
}
}
注解@EnableOpenApi用于开启Swagger的自动配置,如果没加的话,自然而然也就看不到后面的swagger UI面板了。通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger UI面板;在 Docket 上添加筛选条件。Docket 类提供了 apis() 和 paths() 两个方法来帮助我们在不同级别上过滤接口:
- apis() :通过指定扫描路径的方式,让 Swagger 只去某些路径下面扫描文件。
- paths() :通过筛选 API 的 url 进行过滤。
在上面的Swagger 配置类SwaggerConfig中,我们定义了 Docket 实例的 apis() 和 paths(),那么,swagger接口文档界面将只会展示包com.eg.wiener.controller中的API。关于PathSelectors.ant()的用法,各位同仁可以调试一下,由于时间有限,未曾验证是否可用。
另一种解决方案就是使用@ApiIgnore注解屏蔽某些API。如果想在API文档中屏蔽掉某个接口,那么只需要在这个接口上加上@ApiIgnore 即可。
丰富文档内容
在完成了上述配置后,已经算是初步集成Springfox Swagger3,可以启动服务查看API文档内容了。但是这样的文档主要针对请求本身,描述信息的主要来源是函数的命名,对用户并不友好,我们通常需要使用swagger注解增加一些说明文字来使得API文档内容更加丰满。Swagger中常用的注解及其说明:
@Api:用在类上,说明该类的作用。
@ApiOperation:为API增加方法说明。
@ApiImplicitParams : 用在方法上包含一组参数说明。
@ApiImplicitParam:给方法入参增加说明。
@ApiResponses:用于表示一组响应
@ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息
l code:数字,例如400
l message:信息,例如"必填参数不可为空"
l response:抛出异常的类
@ApiModel:描述一个Model的信息(一般用在请求参数无法使用@ApiImplicitParam注解进行描述的时候)
l @ApiModelProperty:描述一个model的属性
案例分析
修改API实体类User,添加swagger注解:
@Setter
@Getter
@ToString
@ApiModel("用户实体")
public class User implements Serializable {
private static final long serialVersionUID = -8842370047277749376L;
@ApiModelProperty("用户 id")
private Long id;
@ApiModelProperty("用户姓名")
private String userName;
private Integer age;
private String address;
private String mobilePhone;
private String remark;
public User() {
}
public User(Long id, String userName, Integer age) {
this.id = id;
this.userName = userName;
this.age = age;
}
}
在实体类使用注解@ApiModel和 @ApiModelProperty可以添加属性备注,这些备注信息将展示在swagger页面的Schema中,效果如下:
在 controller 包下新建 UserController.java 类,通过在控制器类上增加 @Api 注解,可以给控制器添加标签信息。通过在接口方法上增加 @ApiOperation 注解来添加对接口的描述。关于swagger注解的更多信息,这里就不再阐述,需要的话,请去问问度娘。
/**
* @author Wiener
*/
@RestController
@RequestMapping("/user")
@Api(tags="用户API")
public class UserController {
private static Logger logger = LoggerFactory.getLogger(UserController.class);
/**
* 同时使用 @RequestBody 与 @RequestParam()
* http://localhost:8087/wiener/user/addUser?token=IamToken
* @param user
* @param token
* @return
* @throws Exception
*/
@PostMapping("/addUser")
@ApiOperation(value="用户新增")
public User addUser(@RequestBody User user, @RequestParam("token") String token) throws Exception {
user.setRemark(token);
return user;
}
/**
* 示例地址 http://localhost:8087/wiener/user/getUser?id=9996669
* @return
* @throws Exception
*/
@GetMapping("/getUser")
@ApiOperation(value="用户查询(ID)")
@ApiImplicitParam(name="id",value="查询ID",required=true)
public User getUser(Long id) throws Exception {
logger.info("--------------------");
User user = new User();
user.setId(id);
user.setAddress("测试地址是 " + UUID.randomUUID().toString());
logger.info("类信息: {}", user.getClass());
return user;
}
}
这个时候已经算是进一步集成Springfox-Swagger3了,启动项目后访问http://IP:port/your-app-root/swagger-ui/index.html
可以看到我们的swagger文档界面,其中,IP表示服务器IP地址,port表示项目配置的端口号,your-app-root表示项目配置的根路径。在我的项目中,其访问路径是http://127.0.0.1:8087/wiener/swagger-ui/index.html
,在浏览器访问此URL进入如下文档界面:
使用 SwaggerUI访问API
找到用户查询API getUser并进入接口详情页面,可以在详情页面右侧看到** Try it out** 按钮,单击此按钮即可进入接口调用界面,在id输入框随机输入一个Long类型的数字,单击执行即可请求getUser方法:
从API返回值可以得出结论:使用 Swagger UI 成功访问了API,故集成集成Springfox Swagger3完毕。有底气甩了Postman了,你认为呢?
§小结
Springfox既可以减少创建文档的工作量,同时接口文档又可以融合到代码之中去,使维护API文档和修改代码同步进行,让我们在修改代码逻辑的同时方便的修改文档说明,这太酷了。另外,Swagger UI界面页提供了强大的页面测试功能来调试每个RESTful API。欢迎点赞阅读,一同学习交流;若有疑问,请在文章下方留下你的神评妙论!
§Reference
Spring Boot集成Springfox Swagger3和简单应用的更多相关文章
- Spring Boot 集成 Swagger,生成接口文档就这么简单!
之前的文章介绍了<推荐一款接口 API 设计神器!>,今天栈长给大家介绍下如何与优秀的 Spring Boot 框架进行集成,简直不能太简单. 你所需具备的基础 告诉你,Spring Bo ...
- Spring Boot集成Reactor事件处理框架的简单示例
1. Reactor简介 Reactor 是 Spring 社区发布的基于事件驱动的异步框架,不仅解耦了程序之间的强调用关系,而且有效提升了系统的多线程并发处理能力. 2. Spring Boot集成 ...
- Spring boot集成swagger2
一.Swagger2是什么? Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件. Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格 ...
- Spring Boot 集成 Swagger2 与配置 OAuth2.0 授权
Spring Boot 集成 Swagger2 很简单,由于接口采用了OAuth2.0 & JWT 协议做了安全验证,使用过程中也遇到了很多小的问题,多次尝试下述配置可以正常使用. Maven ...
- Spring Boot 集成 Swagger 生成 RESTful API 文档
原文链接: Spring Boot 集成 Swagger 生成 RESTful API 文档 简介 Swagger 官网是这么描述它的:The Best APIs are Built with Swa ...
- Spring Boot 集成 Swagger 构建接口文档
在应用开发过程中经常需要对其他应用或者客户端提供 RESTful API 接口,尤其是在版本快速迭代的开发过程中,修改接口的同时还需要同步修改对应的接口文档,这使我们总是做着重复的工作,并且如果忘记修 ...
- 【SpringBoot】Spring Boot 集成SwaggerAPI
Spring Boot 集成SwaggerAPI 文章目录 Spring Boot 集成SwaggerAPI Swagger 添加依赖 配置类 config 控制类 controller 接口测试 页 ...
- Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件
上一篇文章,写了如何搭建一个简单的Spring boot项目,本篇是接着上一篇文章写得:Spring boot入门:快速搭建Spring boot项目(一),主要是spring boot集成mybat ...
- Quartz与Spring Boot集成使用
上次自己搭建Quartz已经是几年前的事了,这次项目中需要定时任务,需要支持集群部署,想到比较轻量级的定时任务框架就是Quartz,于是来一波. 版本说明 通过搜索引擎很容易找到其官网,来到Docum ...
随机推荐
- Grakn Forces 2020
比赛链接:https://codeforces.com/contest/1408 A. Circle Coloring 题意 给出三个长为 $n$ 的序列 $a,b,c$,对于每个 $i$,$a_i ...
- CSAPP_AttackLab实验报告
目录 屏幕截图 考察内容 各题答案 level1 level2 level3 level4 level5 解题思路 level1 任务 思路 level2 任务 思路 level3 任务 思路 lev ...
- 2019牛客多校 Round1
Solved:4 Rank:143 A Equivalent Prefixes 题意:求一个最大的r满足在A,B两个数组中1,r里所有的子区间RMQ相等 题解:单调队列秒 #include <b ...
- 使用docker时报错“net/http: TLS handshake timeout”
问题原因 :该命令默认从docker远端镜像仓库中拉取镜像,但由于远端仓库的服务器是在国外,我们国内有的用户很可能都访问不到 解决:使用国内镜像仓库 docker pull registry.dock ...
- rabbitMq学习一
1.安装rabbitmq Windows下安装 首先,我们访问官网[https://www.rabbitmq.com/],点击Get Started. 选择下载安装,由于RabbitMQ使用Erlan ...
- 使用Github+jsDelivr搭建图床和存储服务
使用元素 我的博客NLNet 并未搭建自己的博客,使用博客园(cnblogs),自定义了主题NLNet-Theme. 写作工具Typora 优秀的Markdown编辑器.参考NLNet-Theme,我 ...
- PPT 倒计时时钟,用 GIF 动画实现,可直接使用 -- 附 Python 实现代码
在上课时,有时需要显示一个倒计时时钟,让学生做题. PPT 没有简单有效的方法实现倒计时时钟,参考了多个方案,最终决定采用 GIF 动画来实现. 这样使用起来很简单,只要把事先做好的各个时长的倒计时动 ...
- BIM轻量化——浏览器展示
此篇博客仅为记录,记录钻研过程的零碎思路. 之前考虑过很多可能性,对rvt文件转换格式:.obj.JSON..gltf等等.这些可能性前人一般都尝试过,而且也都做出来了东西. ...
- 手摸手带你学移动端WEB开发
HTML常用标签总结 手摸手带你学CSS HTML5与CSS3知识点总结 手摸手带你学移动端WEB开发 好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/Ro ...
- Socket 编程简介
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. 本章节我们为大家接收 Perl ...