SpringBoot: 后台接口文档 - 基于Swagger3
目录
- 前言:什么是Swagger
- 起步:(只需简单的3步)
- 加载依赖
- 添加注解@EnableOpenApi
- 启动SpringBoot,访问Swagger后台界面
- 配置:基于Java的配置
- 注解:Swagger2 和 Swagger3做对比
- 源码:https://github.com/Jalon2015/spring-boot-demo/tree/master/demo-swagger3
- 问题:踩坑记录(后面再整理)
前言
什么是Swagger:
Swagger 是最流行的 API 开发工具,它遵循 OpenAPI Specification(OpenAPI 规范,也简称 OAS)。
它最方便的地方就在于,API文档可以和服务端保持同步,即服务端更新一个接口,前端的API文档就可以实时更新,而且可以在线测试。
这样一来,Swagger就大大降低了前后端的沟通障碍,不用因为一个接口调不通而争论不休
之前用的看云文档,不过这种第三方的都需要手动维护,还是不太方便
起步
- 加载依赖
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
- 添加@EnableOpenApi注解
@EnableOpenApi
@SpringBootApplication
public class SwaggerApplication {
public static void main(String[] args) {
SpringApplication.run(SwaggerApplication.class, args);
}
}

这样一个简单的Swagger后台接口文档就搭建完成了;
下面我们说下配置和注解
配置
可以看到,上面那个界面中,默认显示了一个basic-error-controller接口分组,但是我们并没有写;
通过在项目中查找我们发现,SpringBoot内部确实有这样一个控制器类,如下所示:

这说明Swagger默认的配置,会自动把@Controller控制器类添加到接口文档中
下面我们就自己配置一下,如下所示:
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
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;
@Configuration
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
// 配置OAS 3.0协议
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.select()
// 查找有@Tag注解的类,并生成一个对应的分组;类下面的所有http请求方法,都会生成对应的API接口
// 通过这个配置,就可以将那些没有添加@Tag注解的控制器类排除掉
.apis(RequestHandlerSelectors.withClassAnnotation(Tag.class))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("GPS Doc")
.description("GPS Doc文档")
.termsOfServiceUrl("http://www.javalover.com")
.contact(new Contact("javalover", "http://www.javalover.cn", "1121263265@qq.com"))
.version("2.0.0")
.build();
}
}
这样上面那个basic-error-controller就看不见了
注解
我们先看下Swagger2中的注解,如下所示:
@Api:用在控制器类上,表示对类的说明
- tags="说明该类的作用,可以在UI界面上看到的说明信息的一个好用注解"
- value="该参数没什么意义,在UI界面上也看到,所以不需要配置"
@ApiOperation:用在请求的方法上,说明方法的用途、作用
- value="说明方法的用途、作用"
- notes="方法的备注说明"
@ApiImplicitParams:用在请求的方法上,表示一组参数说明
- @ApiImplicitParam:用在@ApiImplicitParams注解中,指定一个请求参数的各个方面(标注一个指定的参数,详细概括参数的各个方面,例如:参数名是什么?参数意义,是否必填等)
- name:属性值为方法参数名
- value:参数意义的汉字说明、解释
- required:参数是否必须传
- paramType:参数放在哪个地方
- header --> 请求参数的获取:@RequestHeader
- query --> 请求参数的获取:@RequestParam
- path(用于restful接口)--> 请求参数的获取:@PathVariable
- dataType:参数类型,默认String,其它值dataType="Integer"
- defaultValue:参数的默认值
- @ApiImplicitParam:用在@ApiImplicitParams注解中,指定一个请求参数的各个方面(标注一个指定的参数,详细概括参数的各个方面,例如:参数名是什么?参数意义,是否必填等)
@ApiResponses:用在请求的方法上,表示一组响应
- @ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息
- code:状态码数字,例如400
- message:信息,例如"请求参数没填好"
- response:抛出异常的类
- @ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息
@ApiModel:用于响应类上(POJO实体类),描述一个返回响应数据的信息(描述POJO类请求或响应的实体说明)
(这种一般用在post接口的时候,使用@RequestBody接收JSON格式的数据的场景,请求参数无法使用@ApiImplicitParam注解进行描述的时候)- @ApiModelProperty:用在POJO属性上,描述响应类的属性说明
@ApiIgnore:使用该注解忽略这个某个API或者参数;
上面这些是Swagger2的注解,下面我们看下Swagger3和它的简单对比

接下来我们就用Swagger3的注解来写一个接口看下效果(其中穿插了Swagger2的注解)
- 控制器UserController.java
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
@Tag(name = "user-controller", description = "用户接口")
@RestController
public class UserController {
// 忽略这个api
@Operation(hidden = true)
@GetMapping("/hello")
public String hello(){
return "hello";
}
@Operation(summary = "用户接口 - 获取用户详情")
@GetMapping("/user/detail")
// 这里的@Parameter也可以不加,Swagger会自动识别到这个name参数
// 但是加@Parameter注解可以增加一些描述等有用的信息
public User getUser(@Parameter(in = ParameterIn.QUERY, name = "name", description = "用户名") String name){
User user = new User();
user.setUsername(name);
user.setPassword("123");
return user;
}
@Operation(summary = "用户接口 - 添加用户")
@PostMapping("/user/add")
// 这里的user会被Swagger自动识别
public User addUser(@RequestBody User user){
System.out.println("添加用户");
return user;
}
}
实体类User.java:
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema
@Data
public class User {
@Schema(name = "username", description = "用户名", example = "javalover")
private String username;
@Schema(name = "password", description = "密码", example = "123456")
private String password;
// 隐藏这个属性,这样接口文档的请求参数中就看不到这个属性
@Schema(hidden = true)
private String email;
}
启动后运行界面如下:
- 首页展示:

- /user/add接口展示:

/user/detail接口展示

源码
整理在Github上:https://github.com/Jalon2015/spring-boot-demo/tree/master/demo-swagger3
问题
目前只是简单地体验了下,其实里面还是有很多坑,等后面有空再整理解决,下面列举几个:
- @Paramters参数无效
- @ApiImplicitParamter的body属性无效
- @Tag的name属性:如果name属性不是当前类名的小写连字符格式,则会被识别为一个单独的接口分组
- 等等
最近整理了一份面试资料《Java面试题-校招版》附答案,无密码无水印,感兴趣的可以关注公众号回复“面试”领取。
SpringBoot: 后台接口文档 - 基于Swagger3的更多相关文章
- springboot+swagger接口文档企业实践(下)
目录 1.引言 2. swagger接口过滤 2.1 按包过滤(package) 2.2 按类注解过滤 2.3 按方法注解过滤 2.4 按分组过滤 2.4.1 定义注解ApiVersion 2.4.2 ...
- springboot+swagger接口文档企业实践(上)
目录 1.引言 2.swagger简介 2.1 swagger 介绍 2.2 springfox.swagger与springboot 3. 使用springboot+swagger构建接口文档 3. ...
- springBoot Swagger2 接口文档生成
// 生成配置类 package com.irm.jd.config.swagger; import org.springframework.context.annotation.Bean; impo ...
- Springboot系列(七) 集成接口文档swagger,使用,测试
Springboot 配置接口文档swagger 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配 ...
- SpringBoot整合Swagger3生成接口文档
前后端分离的项目,接口文档的存在十分重要.与手动编写接口文档不同,swagger是一个自动生成接口文档的工具,在需求不断变更的环境下,手动编写文档的效率实在太低.与swagger2相比新版的swagg ...
- SpringBoot + Swagger2 自动生成API接口文档
spring-boot作为当前最为流行的Java web开发脚手架,相信越来越多的开发者会使用其来构建企业级的RESTFul API接口.这些接口不但会服务于传统的web端(b/s),也会服务于移动端 ...
- 如何让接口文档自动生成,SpringBoot中Swagger的使用
目录 一.在SpringBoot项目中配置Swagger2 1.pom.xml中对Swagger2的依赖 2.编写配置类启用Swagger 3.配置实体类的文档 4.配置接口的文档 5.访问文档 二. ...
- SpringBoot 如何生成接口文档,老鸟们都这么玩的!
大家好,我是飘渺. SpringBoot老鸟系列的文章已经写了两篇,每篇的阅读反响都还不错,果然大家还是对SpringBoot比较感兴趣.那今天我们就带来老鸟系列的第三篇:集成Swagger接口文档以 ...
- 电商管理后台 API 接口文档
1. 电商管理后台 API 接口文档 1.1. API V1 接口说明 接口基准地址:http://127.0.0.1:8888/api/private/v1/ 服务端已开启 CORS 跨域支持 AP ...
随机推荐
- 尚硅谷Java——宋红康笔记【day19-day24】
day19 测试Thread中的常用方法: start():启动当前线程:调用当前线程的run() run(): 通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中 curr ...
- Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer
作者:Grey 原文地址:Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer ByteBuffer.allocate()与ByteBuffer.allocateD ...
- SpringBoot 结合 Spring Cache 操作 Redis 实现数据缓存
系统环境: Redis 版本:5.0.7 SpringBoot 版本:2.2.2.RELEASE 参考地址: Redus 官方网址:https://redis.io/ 博文示例项目 Github 地址 ...
- Java学习——强调一下编程风格
讲完了Java的基础语法,大家就可以编写简单的程序代码了,这里有必要强调一下编程风格. 代码风格虽然不影响程序的运行,但对程序的可读性却非常重要.自己编写的程序要让别人看懂,首先在排版方面要非常注意. ...
- 飞(fly)(数学推导,liu_runda的神题)
大概看了两三个小时的题解,思考量很大,实现简单........ 20分: 明显看出,每个点的贡献是x*(x-1)/2;即组合数C(x,2),从x个线段中选出2个的方案数,显然每次相交贡献为1,n^2枚 ...
- expdp数据泵导出数据汇总
[oracle@enmo1 ~]$ mkdir datadump[oracle@enmo1 ~]$ cd datadump/[oracle@enmo1 datadump]$ pwd/home/orac ...
- Windows内核开发-Windows内部概述-2-
Windows内部概述-2- 线程: 执行代码的实体是线程.一个线程的包含在进程里面的,线程使用进程提供的资源来运行代码. 一个线程拥有以下的内容: 1:明确的运行模式,用户态或者内核态. 2:执行的 ...
- Java并发编程--基础进阶高级(完结)
Java并发编程--基础进阶高级完整笔记. 这都不知道是第几次刷狂神的JUC并发编程了,从第一次的迷茫到现在比较清晰,算是个大进步了,之前JUC笔记不见了,重新做一套笔记. 参考链接:https:// ...
- Mongo集群搭建
1.集群角色及架构 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置服务器等 mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器 ...
- 在FLEX中真正的隐藏一个组件,隐藏后不占据自身的位置. (转)
一直被这个问题困扰,就是在设置UI的Visible的时候,改组件的位置一直被占着,比较恶心,今天在这里发现了一个方法, 操作方法如下设置: includeInLayout为false即可 来自:htt ...