之前通过Spring Boot 2.x基础教程:使用Swagger2构建强大的API文档一文,我们学习了如何使用Swagger为Spring Boot项目自动生成API文档,有不少用户留言问了关于文档内容的组织以及排序问题。所以,就特别开一篇详细说说Swagger中文档内容如何来组织以及其中各个元素如何控制前后顺序的具体配置方法。

接口的分组

我们在Spring Boot中定义各个接口是以Controller作为第一级维度来进行组织的,Controller与具体接口之间的关系是一对多的关系。我们可以将同属一个模块的接口定义在一个Controller里。默认情况下,Swagger是以Controller为单位,对接口进行分组管理的。这个分组的元素在Swagger中称为Tag,但是这里的Tag与接口的关系并不是一对多的,它支持更丰富的多对多关系。

默认分组

首先,我们通过一个简单的例子,来看一下默认情况,Swagger是如何根据Controller来组织Tag与接口关系的。定义两个Controller,分别负责教师管理与学生管理接口,比如下面这样:

@RestController
@RequestMapping(value = "/teacher")
static class TeacherController {@GetMapping("/xxx")public String xxx() {return "xxx";}}@RestController
@RequestMapping(value = "/student")
static class StudentController {@ApiOperation("获取学生清单")@GetMapping("/list")public String bbb() {return "bbb";}@ApiOperation("获取教某个学生的老师清单")@GetMapping("/his-teachers")public String ccc() {return "ccc";}@ApiOperation("创建一个学生")@PostMapping("/aaa")public String aaa() {return "aaa";}}

启动应用之后,我们可以看到Swagger中这两个Controller是这样组织的:

图中标出了Swagger默认生成的Tag与Spring Boot中Controller展示的内容与位置。

自定义默认分组的名称

接着,我们可以再试一下,通过@Api注解来自定义Tag,比如这样:

@Api(tags = "教师管理")
@RestController
@RequestMapping(value = "/teacher")
static class TeacherController {// ...}@Api(tags = "学生管理")
@RestController
@RequestMapping(value = "/student")
static class StudentController {// ...}

再次启动应用之后,我们就看到了如下的分组内容,代码中@Api定义的tags内容替代了默认产生的teacher-controllerstudent-controller

合并Controller分组

到这里,我们还都只是使用了TagController一一对应的情况,Swagger中还支持更灵活的分组!从@Api注解的属性中,相信聪明的读者一定已经发现tags属性其实是个数组类型:

我们可以通过定义同名的Tag来汇总Controller中的接口,比如我们可以定义一个Tag为“教学管理”,让这个分组同时包含教师管理和学生管理的所有接口,可以这样来实现:

@Api(tags = {"教师管理", "教学管理"})
@RestController
@RequestMapping(value = "/teacher")
static class TeacherController {// ...}@Api(tags = {"学生管理", "教学管理"})
@RestController
@RequestMapping(value = "/student")
static class StudentController {// ...}

最终效果如下:

更细粒度的接口分组

通过@Api可以实现将Controller中的接口合并到一个Tag中,但是如果我们希望精确到某个接口的合并呢?比如这样的需求:“教学管理”包含“教师管理”中所有接口以及“学生管理”管理中的“获取学生清单”接口(不是全部接口)。

那么上面的实现方式就无法满足了。这时候发,我们可以通过使用@ApiOperation注解中的tags属性做更细粒度的接口分类定义,比如上面的需求就可以这样子写:

@Api(tags = {"教师管理","教学管理"})
@RestController
@RequestMapping(value = "/teacher")
static class TeacherController {@ApiOperation(value = "xxx")@GetMapping("/xxx")public String xxx() {return "xxx";}}@Api(tags = {"学生管理"})
@RestController
@RequestMapping(value = "/student")
static class StudentController {@ApiOperation(value = "获取学生清单", tags = "教学管理")@GetMapping("/list")public String bbb() {return "bbb";}@ApiOperation("获取教某个学生的老师清单")@GetMapping("/his-teachers")public String ccc() {return "ccc";}@ApiOperation("创建一个学生")@PostMapping("/aaa")public String aaa() {return "aaa";}}

效果如下图所示:

内容的顺序

在完成了接口分组之后,对于接口内容的展现顺序又是众多用户特别关注的点,其中主要涉及三个方面:分组的排序、接口的排序以及参数的排序,下面我们就来逐个说说如何配置与使用。

分组的排序

关于分组排序,也就是Tag的排序。目前版本的Swagger支持并不太好,通过文档我们可以找到关于Tag排序的配置方法。

第一种:原生Swagger用户,可以通过如下方式:

file

第二种:Swagger Starter用户,可以通过修改配置的方式:

swagger.ui-config.tags-sorter=alpha

似乎找到了希望,但是其实这块并没有什么可选项,一看源码便知:

public enum TagsSorter {ALPHA("alpha");private final String value;TagsSorter(String value) {this.value = value;}@JsonValuepublic String getValue() {return value;}public static TagsSorter of(String name) {for (TagsSorter tagsSorter : TagsSorter.values()) {if (tagsSorter.value.equals(name)) {return tagsSorter;}}return null;}
}

是的,Swagger只提供了一个选项,就是按字母顺序排列。那么我们要如何实现排序呢?这里笔者给一个不需要扩展源码,仅依靠使用方式的定义来实现排序的建议:为Tag的命名做编号。比如:

@Api(tags = {"1-教师管理","3-教学管理"})
@RestController
@RequestMapping(value = "/teacher")
static class TeacherController {// ...}@Api(tags = {"2-学生管理"})
@RestController
@RequestMapping(value = "/student")
static class StudentController {@ApiOperation(value = "获取学生清单", tags = "3-教学管理")@GetMapping("/list")public String bbb() {return "bbb";}// ...}

由于原本存在按字母排序的机制在,通过命名中增加数字来帮助排序,可以简单而粗暴的解决分组问题,最后效果如下:

接口的排序

在完成了分组排序问题(虽然不太优雅…)之后,在来看看同一分组内各个接口该如何实现排序。同样的,凡事先查文档,可以看到Swagger也提供了相应的配置,下面也分两种配置方式介绍:

第一种:原生Swagger用户,可以通过如下方式:

第二种:Swagger Starter用户,可以通过修改配置的方式:

swagger.ui-config.operations-sorter=alpha

很庆幸,这个配置不像Tag的排序配置没有可选项。它提供了两个配置项:alphamethod,分别代表了按字母表排序以及按方法定义顺序排序。当我们不配置的时候,改配置默认为alpha。两种配置的效果对比如下图所示:

参数的排序

完成了接口的排序之后,更细粒度的就是请求参数的排序了。默认情况下,Swagger对Model参数内容的展现也是按字母顺序排列的。所以之前教程中的User对象在文章中展现如下:

如果我们希望可以按照Model中定义的成员变量顺序来展现,那么需要我们通过@ApiModelProperty注解的position参数来实现位置的设置,比如:

@Data
@ApiModel(description = "用户实体")
public class User {@ApiModelProperty(value = "用户编号", position = 1)private Long id;@NotNull@Size(min = 2, max = 5)@ApiModelProperty(value = "用户姓名", position = 2)private String name;@NotNull@Max(100)@Min(10)@ApiModelProperty(value = "用户年龄", position = 3)private Integer age;@NotNull@Email@ApiModelProperty(value = "用户邮箱", position = 4)private String email;}

最终效果如下:

小结

本文详细的介绍了Swagger中对接口内容的组织控制。有些问题并没有通过配置来解决,也可能是对文档或源码内容的了解不够深入。如果读者有更好的实现方案,欢迎提出与交流。

代码示例

本文的完整工程可以查看下面仓库中的chapter2-4目录:

  • Github:https://github.com/dyc87112/SpringBoot-Learning/tree/2.x
  • Gitee:https://gitee.com/didispace/SpringBoot-Learning/tree/2.x

如果您觉得本教程对您有帮助,欢迎Star支持,您的关注是我坚持的动力!!

相关资料

  • https://swagger.io/docs/
  • http://blog.didispace.com/spring-boot-learning-21-2-2/
  • https://github.com/SpringForAll/spring-boot-starter-swagger

jeesite如何配置swagger_Spring Boot 2.x基础教程:Swagger接口分类与各元素排序问题详解...相关推荐

  1. flyway常用配置_Spring Boot 2.x基础教程:使用Flyway管理数据库版本

    之前已经介绍了很多在Spring Boot中使用MySQL的案例,包含了Spring Boot最原始的JdbcTemplate.Spring Data JPA以及我们国内最常用的MyBatis.同时, ...

  2. Python学习入门基础教程(learning Python)--5.5 Python写操作详解

    在前文5.3节我们简单的学习了如何在Python里进行文件的写操作,所举例里写入的都是字符串数据,那我们现在想写入数值型数据可以直接写入么?我们先看看下边的程序是否能正常运行? wfile = ope ...

  3. Python学习入门基础教程(learning Python)--5.4 Python读文件详解

    问题1.多余的'\n' 在5.2节里我们基本掌握了Python下的文件读文件操作基本方法,但是也存在一些小小问题,细心的读者会发现下面这幅图的问题. 上图每次打印输出words时,先打印了一行从文件里 ...

  4. 【基础教程】Python整数类型(int)详解

    整数就是没有小数部分的数字,Python 中的整数包括正整数.0 和负整数. 有些强类型的编程语言会提供多种整数类型,每种类型的长度都不同,能容纳的整数的大小也不同,开发者要根据实际数字的大小选用不同 ...

  5. python 类方法 实例方法的区别_python基础教程Python实例方法、类方法、静态方法区别详解...

    1.关于参数的区别 实例方法:定义实例方法是最少有一个形参 ---> 实例对象,通常用 self 类方法:定义类方法的时候最少有一个形参 ---> 类对象,通常用 cls 静态方法:定义静 ...

  6. 【基础教程】Python复数类型(complex)详解

    复数(Complex)是 Python 的内置类型,直接书写即可.换句话说,Python 语言本身就支持复数,而不依赖于标准库或者第三方库. 复数由实部(real)和虚部(imag)构成,在 Pyth ...

  7. Spring Boot 2.x基础教程:默认数据源Hikari的配置详解

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

  8. Spring Boot 2.x基础教程:使用 ECharts 绘制各种华丽的数据图表

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

  9. Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

最新文章

  1. 【数据库】兴唐第二十七节课之jdbc的使用
  2. 电机编码器调零步骤_西门子伺服电机电缆选型
  3. [转]数据结构:图的存储结构之邻接多重表
  4. 数控铣削图案及编程_数控铣削简单图案编程
  5. 【Transformer】ViT:An image is worth 16x16: transformers for image recognition at scale
  6. P4322-[JSOI2016]最佳团体【0/1分数规划,树形背包】
  7. LeetCode 三数之和 — 优化解法
  8. SSL请求trustStore的两种注册方式
  9. MTK:文件操作接口详解
  10. Hive最全学习笔记总结
  11. BIM族库下载——Revit栏杆族库
  12. 2021亚太杯数学建模竞赛
  13. linux网络不通检查方法
  14. TensorFlow Objection Detection API使用教程
  15. 波及Win 11,让安全员自动放弃的零日漏洞,微软这次麻烦了
  16. 机器有了综合感官?新研究结合视觉和听觉进行情感预测 | 一周AI最火论文
  17. python 脚本分析dns日志计算前几位的请求数域名
  18. 信息量,熵,互信息,信道容量等相关概念
  19. [项目管理]管理杂谈—三个火枪手
  20. Android多国语言翻译 字符串目录详解

热门文章

  1. 优步杭州推出顺路接单功能,不久将向全国开放!
  2. QStackedWidget设置无效问题
  3. Extmail maildrop错误
  4. Dreamweaver里文档工具栏位置
  5. Updatepanel 注册javascript 方法
  6. Device Tree Usage(转)https://elinux.org/Device_Tree_Usage
  7. SpringBoot项目报错Cannot determine embedded database driver class for database type NONE
  8. 数据解析(XML,JSON)
  9. python从网络时间服务器获取并打印当前时间以及pip安装ntplib的一次体验
  10. 【BZOJ】【3301】【USACO2011 Feb】Cow Line