玩转 SpringBoot 2 快速整合 | 丝袜哥(Swagger)
概述
首先让我引用 Swagger 官方的介绍:
Design is the foundation of your API development. Swagger makes API design a breeze, with easy-to-use tools for developers, architects, and product owners.
设计是API开发的基础。Swagger使API设计变得轻而易举,为开发人员,架构师和产品所有者提供了易于使用的工具。
作为一个后端开发者,你是否为开发完 API 接口后为写文档而烦恼、当 App 开发人员或前端开发人员看不懂的你写的接口文档,你还得去给他们讲一遍怎么使用而烦恼。
使用 Swagger 这些烦恼统统的消失,Swagger一个集预览和测试于一身的在线可视化 RESTful 风格的 Web 服务框架。
闲话少说,直接开整!
基础配置和 API 接口开发
第一步:先引入Swagger starter 依赖到 pom 文件中。我们这里采用2.7.0 版本
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
还有一点需要注意的是必须引入 Spring Boot Web starter 依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
第二步:编写 RESTful API 服务:一个用户的增删改查。
public class User {
private String name;
private Integer age;
//......省略get and set方法
}
定义用户 RESTFull API 服务 Controller。
@RestController()
@RequestMapping("/user")
public class UserController {
//......
}
在 RESTFull API 服务 Controller 添加根据 id查询用户的接口
/**
* 根据用户id 查询用户
* @return
*/
@GetMapping("/{id}")
public User get(@PathVariable(name = "id") Long id){
User user = new User();
user.setName("lijunkui");
user.setAge(18);
log.info("springboot查询用户成功:"+"id:{}",id);
return user;
}
定义添加用户接口。
/**
* 添加用户
*/
@PostMapping()
public void add(User user){
log.info("springboot添加用户成功:"+"name:{},age:{}",user.getName(),user.getAge());
}
定义更新用户接口。
/**
* 全部更新
* @param user
*/
@PutMapping()
public void updatePut(User user){
log.info("springboot Put 修改用户成功:"+"name:{},age:{}",user.getName(),user.getAge());
}
定义 局部更新用户接口。
/**
* 局部更新
*/
public void updatePatch(@PathVariable("name") String name){
log.info("springboot Patch 修改用户成功:"+"name:{}",name);
}
定义删除用户接口。
/**
* 删除用户
*/
@DeleteMapping("/{id}")
public void delete(@PathVariable("id") Long id){
User user = new User();
user.setName("lijunkui");
user.setAge(18);
log.info("springboot 删除用户成功:"+"id:{}",id);
}
定义根据 json 数据更新用户接口。
/**
* 根据requestBody 更新用户信息
* @param user
* @return
*/
@PostMapping("/updateUserByRequestBody")
public void updateUserByRequestBody(@RequestBody User user){
log.info("updateUserByRequestBody 修改用户成功:"+"name:{},age:{}",user.getName(),user.getAge());
}
第三步:编写 Swagger 的Config配置类
//让Spring来加载该类配置
@Configuration
//是否禁用swagger 的配置
@ConditionalOnProperty(prefix = "swagger",value = {"enable"},havingValue = "true")
//启用Swagger2
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket alipayApi() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("简单用户管理API接口文档")
.apiInfo(apiInfo())
.select()
//扫描配置 classpath 路径配置 Swagger注解下的 Api文档。 .apis(RequestHandlerSelectors.basePackage("com.ljk.springBootLearn.users"))
.paths(PathSelectors.any()).build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("SprignBoot学习专栏")
.description("集成swagger")
.termsOfServiceUrl("https://blog.csdn.net/ljk126wy")
//创建人
.contact(new Contact("桌前明月", "http://www.baidu.com", ""))
//版本
.version("1.0")
//API 描述
.description("简单介绍如有问题还望指正")//
.build();
}
}
我来简单介绍一下 Swagger 的配置类中方法使用介绍。
每一组 Controller 的 Api 都对应一个 Docket 配置 ,如果有多个组 Api 就应该配置多个Docket 的 Bean。
Docket.groupName(String name):配置接口分组的名称,name为分组的名称。对应下图中红色框中的信息
apiInfo(ApiInfo apiInfo ) 配置Api 文档的一些公共的描述信息,对应下图中红色框中的信息。
paths():配置需要显示具体 Api 的路径。
我们通过PathSelectors类的4个方法来进行判断
- PathSelectors.any(): 所有的api都显示
- PathSelectors.none(): 所有的路径都不显示
- PathSelectors.regex(String pathRegex): 按照String的matches方法进行匹配。例如:PathSelectors.regex("/user/*")
- PathSelectors.ant(String antPattern): 按照Spring的AntPathMatcher提供的match方法进行匹配 例如:PathSelectors.ant("/user/**")
AntPathMatcher.match(String pattern, String path) 可以做URLs匹配,规则如下
?匹配一个字符
*匹配0个或多个字符
** 匹配0个或多个目录
第四步:在application.properties 或 application.yml中添加配置信息。
在application.properties 配置信息如下:
server.port=8080
server.servlet.context-path=/sbe
swagger.enable = true
application.yml 配置内容如下:
application.yml 配置信息如下:
server:
port: 8080 #游览器访问项目端口号
servlet:
context-path:/sbe #游览器访问项目的名称
swagger:
enable: true
需要注意的是application.properties 或 application.yml 只能存在一个,swagger.enable =
true表示是否使用Swagger的的功能。主要用于生产环境和开发环境的配置。切记生产环境要配置成false。
到目前为止SpringBoot 整合 Swagger 基础部分搭建完毕!接下来让我们今天的重点 Swagger 配置注解。
Swagger 注解使用实战
@Api : 说明接口类的作用。
@Api(tags ="用户管理")
@RestController()
@RequestMapping("/user")
public class UserController {
}
访问 Swagger UI 界面如下:
@ApiOperation: 用在方法上 说明方法的作用。
@ApiOperation(value="根据id获取用户信息")
@GetMapping("/{id}")
public User get(@PathVariable(name = "id") Long id){
//省略逻辑代码
}
访问 Swagger UI 界面如下:
@ApiImplicitParam: 方法中参数的说明
/**
* 根据用户id 查询用户
* @return
*/
@ApiImplicitParam(paramType= "path", name = "id", value = "用户id", required = true, dataType = "Long")
@GetMapping("/{id}")
public User get(@PathVariable(name = "id") Long id){
//省略逻辑代码
}
访问 Swagger UI 界面如下:
@ApiImplicitParams(): 配置多个ApiImplicitParam
@ApiImplicitParams({
@ApiImplicitParam(name="name",value="用户名",dataType="string", required = true, paramType = "form",example="ljk"),
@ApiImplicitParam(name="age",value="用户年龄",dataType="int", paramType = "form")})
@PostMapping()
public void add(User user){
//省略逻辑代码
}
访问 Swagger UI 界面如下:
@ApiModel: 描述返回实体类信息
@ApiModel(value="user对象",description="用户对象user")
public class User {
}
@ApiModelProperty: 描述返回实体类属性的信息
public class User {
@ApiModelProperty(value="用户名",name="name",example="xingguo")
private String name;
@ApiModelProperty(value="年龄1",name="age",required=true)
private Integer age;
}
访问 Swagger UI 界面如下:
@ApiResponse: 错误相应信息描述
@ApiResponses: 描述多个错误信息
@GetMapping("/{id}")
@ApiResponses({ @ApiResponse(code = 400, message = "请求无效 (Bad request)") })
public User get(@PathVariable(name = "id") Long id){
//省略逻辑代码
}
访问 Swagger UI 界面如下:
@ApiParam: 用于声明通过request接受的参数。
@ApiIgnore(): 忽略的字段不显示在api文档中。
public void logon(
@ApiParam(name="loginName",value="登录名称",required=true)
@RequestParam String loginName,
@ApiParam(name="password",value="密码",required=true)
@RequestParam String password,
@ApiIgnore()Model model,HttpServletRequest request){
}
启动 SpringBoot 项目访问:localhost:8080/sbe/swagger-ui.html 如下图所示:
我们可以在如下图中的 name 和 age 输入框中输入内容并进行测试,这里就不一个个进行测试啦。
小结
SpringBoot 整合 Swagger 需要通过SpringBoot Java Config的方式配置 Api 接口扫描的路径、接口组介绍、接口版本、接口描述等信息。接下来就是 Swagger 的具体配置注解,常用的配置注解如下:
@Api :说明接口类的作用。
@ApiOperation:用在方法上 说明方法的作用。
@ApiImplicitParam:方法中参数的说明。
@ApiImplicitParams():配置多个 ApiImplicitParam
@ApiModel:描述返回实体类信息。
@ApiModelProperty:描述返回实体类属性的信息。
@ApiResponse:错误相应信息描述。
@ApiResponses:描述多个错误信息。
@ApiParam:用于声明通过request接受的参数。
@ApiIgnore():忽略的字段不显示在api文档中。
如果你还没有操作过,可以跟着博客敲一遍哈!
代码示例
文中的代码可以参考我的 GitHub 仓库名称 springbootexamples 中的 spring-boot-2.x-swagger 进行查看
GitHub:https://github.com/zhuoqianmingyue/springbootexamples
示例程序环境版本:
SpringBoot Version:2.1.0.RELEASE
SpringMVC Version:5.1.2RELEASE
Maven Version:3.2.5
JDK Version:1.8.0_144
玩转 SpringBoot 2 快速整合 | 丝袜哥(Swagger)的更多相关文章
- 玩转 SpringBoot 2 快速整合 | JSP 篇
前言 JavaServer Pages(JSP)技术使Web开发人员和设计人员能够快速开发和轻松维护利用现有业务系统的信息丰富的动态Web页面. 作为Java技术系列的一部分,JSP技术可以快速开发独 ...
- 玩转 SpringBoot 2 快速整合拦截器
概述 首先声明一下,这里所说的拦截器是 SpringMVC 的拦截器 HandlerInterceptor.使用SpringMVC 拦截器需要做如下操作: 创建拦截器类需要实现 HandlerInte ...
- 玩转 SpringBoot 2 快速整合 | FreeMarker篇
FreeMarker 介绍 Apache FreeMarker™是一个模板引擎:一个Java库,用于根据模板和更改数据生成文本输出(HTML网页,电子邮件,配置文件,源代码等).模板是用FreeMar ...
- 玩转 SpringBoot 2 快速整合 | Thymeleaf 篇
前言 Thymeleaf是一个适用于Web和独立环境的现代服务器端Java模板引擎. Thymeleaf的主要目标是为您的开发工作流程带来优雅的自然模板 - 可以在浏览器中正确显示的HTML,也可以用 ...
- 玩转 SpringBoot 2 快速整合 Filter
概述 SpringBoot 中没有 web.xml, 我们无法按照原来的方式在 web.xml 中配置 Filter .但是我们可以通过 JavaConfig(@Configuration +@Bea ...
- 玩转 SpringBoot 2 之整合 JWT 下篇
前言 在<玩转 SpringBoot 2 之整合 JWT 上篇> 中介绍了关于 JWT 相关概念和JWT 基本使用的操作方式.本文为 SpringBoot 整合 JWT 的下篇,通过解决 ...
- 使用Springboot + Gradle快速整合Mybatis-Plus
使用Springboot + Gradle快速整合Mybatis-Plus 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] MyBatis-Plus(简称 MP)是一个 MyBatis ...
- 玩转 SpringBoot 2 快速搭建 | RESTful Api 篇
概述 RESTful 是一种架构风格,任何符合 RESTful 风格的架构,我们都可以称之为 RESTful 架构.我们常说的 RESTful Api 是符合 RESTful 原则和约束的 HTTP ...
- 玩转 SpringBoot 2 之整合 JWT 上篇
前言 该文主要带你了解什么是 JWT,以及JWT 定义和先关概念的介绍,并通过简单Demo 带你了解如何使用 SpringBoot 2 整合 JWT. 介绍前在这里我们来探讨一下如何学习一门新的技术, ...
随机推荐
- JQuery制作简易的考试答题管理系统
网页效果: 代码部分: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...
- HTTP_3_HTTP报文
用户HTTP协议交互的信息被称为HTTP报文 简单的请求报文和响应报文实例 HTTP传输过程中常用设置 提升传输速率 编码压缩传输 (常见压缩格式:gzip compress deflate ) 分块 ...
- spring与mybatis整合(扫描Mapper接口)
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" ...
- spark 源码分析之二十一 -- Task的执行流程
引言 在上两篇文章 spark 源码分析之十九 -- DAG的生成和Stage的划分 和 spark 源码分析之二十 -- Stage的提交 中剖析了Spark的DAG的生成,Stage的划分以及St ...
- 【iOS】Ineligible Devices || “无法下载应用程序”
今天遇到了这个问题,Xcode 显示如图所示: 还有真机测试无法安装的问题,如图: 究其原因,都是 版本不匹配 的问题!在 Xcode 中的 PROJECT 和 TARGETS 设置下版本就行了,如下 ...
- PHP后门***详解
说起php后门***我就心有愉季啊前不久一个站就因不小心给人注入了然后写入了小***这样结果大家知道的我就不说了下面我来给大家收集了各种php后门***做法大家可参考. php后门***对大家来说一点 ...
- powermockito单元测试之深入实践
概述 由于最近工作需要, 在项目中要做单元测试, 以达到指定的测试用例覆盖率指标.项目中我们引入的powermockito来编写测试用例, JaCoCo来监控单元测试覆盖率.关于框架的选择, 网上讨论 ...
- Linux基础进程管理优先级
一.进程优先级 Linux进程调度及多任务 每个cpu(或者cpu核心)在一个时间点上只能处理一个进程,通过时间片技术,Linux实际能够运行的进程(和线程数)可以超出实际可用的cpu及核心数量.Li ...
- javascript基础案例解析
学完了JavaScript基础部分,总结出一些基本案例,以备日后查看! 1.九九乘法口诀表:在控制台中输出九九乘法口诀表!代码如下: <!DOCTYPE html> <html> ...
- 逆向破解之160个CrackMe —— 002-003
CrackMe —— 002 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...