Spring Boot集成Swagger接口分类与各元素排序问题

news2024/9/21 11:09:23

在上一篇中我们完成使用JSR-303校验,以及利用Swagger2得到相关接口文档,这节,我们在原先的基础之上,完成Swagger中关于对各个元素之间控制前后顺序的具体配置方法。

Swagger的接口的分组

首先我们需要对Swagger中的接口也就是以Controller 层作为第一级梯度进行组织的,Controller在我们实际开发中,与其他具体接口之间是存在一对多的关系,我们可以将同属一个模块的接口定义在一个Controller 中,默认情况之下,我们的Swagger 是以Controller为单位,对接口进行分组管理,在Swagger 中,这个分组的元素被称为Tag,但是这里的Tag与接口的关系并不是一对多关系,它支持更加丰富的多对多的关系,

默认的分组

首先通过创建一个简单的例子进,来看一下,我们是如何处理Swagger是如如何根据Controller来组织Tag与接口关系的,定义两个Controller,分别负责教师管理与学生管理接口,为了重复利用代码,我们就在上一篇的基础之上进行代码添加了:
为了简单明了,我均将下列代码放在Application类里边

@RestController
@RequestMapping(value = "/teacher")
static class TeacherController {

    @GetMapping("/miaow")
    public String miaow() {
        return "miaow";
    }
}

@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";
    }
}

此时通过:localhost:8080/swagger-ui.html 访问得到我们Swagger的组织结构是

在这里插入图片描述
在上图中我们了解到我们定义的控制层,得到的swagger生成的默认结构展示出来了。

application.properties文件

swagger.title=spring-boot-starter-swagger
swagger.description=Starter for swagger 2.x
swagger.version=1.9.0.RELEASE
swagger.license=Apache License, Version 2.0
swagger.licenseUrl=https://www.apache.org/licenses/LICENSE-2.0.html
swagger.termsOfServiceUrl=https://github.com/dyc87112/spring-boot-starter-swagger
swagger.contact.name=miaow
swagger.contact.url=https://luoxiaohei520.github.io
swagger.contact.email=miaow@qq.com
swagger.base-package=com.didispace
swagger.base-path=/**

swagger.ui-config.tags-sorter=alpha
swagger.ui-config.operations-sorter=alpha

在启动类添加相关控制层接口:

@EnableSwagger2Doc
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
       SpringApplication.run(Application.class, args);
    }

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

得到结果集
在这里插入图片描述

自定义默认分组的名称

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

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

我们在Api的tags修改成为我们想要的表达文字:
在这里插入图片描述

合并Controller分组

在此,我们使用了Tag和Controller 一一对应的情况,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中,但是如果我们希望精确到某个接口的合并,我们应该如何做?

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

    @ApiOperation(value = "maiow")
    @GetMapping("/miaow")
    public String miaow() {
        return "miaow";
    }

}

@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用户,修改:
在这里插入图片描述
第二种方式:Swagger Starter用户,可以通过修改配置的方式:

swagger.ui-config.tags-sorter=alpha

修改上述的配置的源码:

public enum TagsSorter {
  ALPHA("alpha");

  private final String value;

  TagsSorter(String value) {
    this.value = value;
  }

  @JsonValue
  public 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 提供考虑一个选项,就是按照字字母顺序进行排序。

@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的排序配置没有可选项。它提供了两个配置项:alpha和method,分别代表了按字母表排序以及按方法定义顺序排序。当我们不配置的时候,改配置默认为alpha。

在这里插入图片描述

参数的排序

完成了接口的排序后,更加细粒度的就是请求参数的排序了,在默认的情况下,我们的Swagger会对Model的参数内容展示进行按照字母排序,我们的展示的User在Swagger之前是这样的:

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

对应的User对象如下:
在这里插入图片描述
w未加

@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;


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public User(Long id, String name, Integer age, String email) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.email = email;
    }

    public User() {
    }
}

加了Position之后的swagger展示:
在这里插入图片描述

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

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

相关文章

浅谈wheel滚轮事件

<divonWheel{(ee) > {// new WheelEvent(自定义,e) 获取 e[wheelDelta],e[deltaY] 判断滚轮方向var e new WheelEvent(syntheticWheel,ee)console.log(滚动触发事件, e,ee);console.log(滚动触发事件e.wheelDelta, e[wheelDelta],e[deltaY]);console.log(滚动触发事件e.…

Spirit:继承 gh-ost 灵魂的 MySQL 在线大表变更方案

昨天看到社区发布了一个新的 MySQL 大表变更工具 Spirit。是海外支付巨头 Block 旗下的 Cash App (地位类似于支付宝) 开源的&#xff0c;作者之前也在 PingCAP 工作过。 目前市面上做大表变更的方案有两个&#xff1a; Percona 开源的 pt-online-schema-change&#xff0c;基…

WMS仓储管理系统如何保障仓库的安全性

仓库安全一直以来都是企业运营中的重要一环&#xff0c;而WMS仓储管理系统则可以为仓库安全提供有力的保障。本文将探讨WMS仓储管理系统如何在实际应用中确保仓库的安全性。 WMS管理系统是一种专门用于管理仓库和库存的软件&#xff0c;它可以帮助企业对库存进行跟踪、管理以及…

鼎鑫鸿鄴引入“能源互联网+”理念 打造共赢

近年来&#xff0c;随着全球能源消耗的不断增长和环境问题的日益突出&#xff0c;清洁能源转型成为全球共同关注的话题。中国作为全球最大的能源消费国&#xff0c;也在积极推动能源结构的优化和清洁能源的发展。鼎鑫鸿鄴新能源科技有限公司在推动清洁能源转型方面制定了一系列…

探索 10 个有价值的在线免费设计模板网站

对于许多设计师来说&#xff0c;现成的模板无疑可以大大提高工作效率和质量&#xff0c;特别是在赶上项目过程时。然而&#xff0c;找到合适和免费的模板是另一个问题。在这里&#xff0c;我整理了10个推荐的设计模板网站&#xff0c;希望能对您有所帮助。 1.即时设计 即时设计…

转化率的催化剂:网站客服机器人如何推动企业销售?

随着5G的推广&#xff0c;人工智能技术的普及程度越来越高&#xff0c;人机交互已经成为这个时代的常态&#xff0c;无论是在我们的日常生活中还是在企业服务中都非常常见。如今&#xff0c;无论是营销型企业还是客服型企业&#xff0c;都纷纷采用网站客服机器人服务&#xff0…

研究目标检测的同学看过来:超越YOLOv8!华为提出Gold-YOLO:高效实时

超越YOLOv8&#xff01;华为提出Gold-YOLO&#xff1a;高效实时目标检测器 超越YOLO系列&#xff08;v5、v6、v7、v8&#xff09;&#xff01;Gold-YOLO&#xff1a;一种全新的实时目标检测器&#xff0c;提出一种GD新机制&#xff0c;通过卷积和自注意力操作来实现&#xff0…

Paper - Neural Discrete Representation Learning (VQ-VAE) 论文简读

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/133992971 VQ-VAE 是基于变分自编码器&#xff08;VAE&#xff09;的生成模型&#xff0c;可以学习离散的潜在表示。VQ-VAE 的主要创新是引入了一…

【Python】基于非侵入式负荷检测与分解的电力数据挖掘

文章目录 前言一、案例背景二、分析目标三、分析过程四、数据准备4.1 数据探索4.2 缺失值处理 五、属性构造5.1 设备数据5.2 周波数据 六、模型训练七、性能度量文末送书&#xff1a;《Python数据挖掘&#xff1a;入门、进阶与实用案例分析》 前言 本案例将根据已收集到的电力…

Nodejs和Node-red的关系

NPM相关知识 npm概念 npm&#xff1a;Node Package Manager&#xff0c;Node包管理器。是Node.js默认的&#xff0c;以JavaScript编写的软件包管理系统。 npm工作原理 npm的操作原理是各个官网使用npm publish把代码提交到npm的服务器&#xff0c;其他人想要使用这些代码&am…

20 行为型模式-策略模式

1 策略模式概述 策略模式(strategy pattern)的原始定义是&#xff1a;定义一系列算法&#xff0c;将每一个算法封装起来&#xff0c;并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而变化。 2 策略模式原理 3 策略模式实现 策略模式的本质是通过Context类…

高数基础常用公式(持续更新)

1、求根公式 2、三角函数特殊度数对应值 3、三角函数常用公式

4个方法,提高excel表格制作效率

使用excell文件的时候总是会少不了要大批量的数据进行操作&#xff0c;今天分享4个快速使用excel操作的小技巧。希望能够帮大家提高excel制作效率。 技巧一&#xff1a;快速求和 当你想要分别得到行列的总和&#xff0c;我们可以选中表格数据以及总和的单元格&#xff0c;按住…

SAP-PP-查询报工数据

有两个报表可以查询报工数据&#xff0c;COOIS和COHV 两个程序大致差不多 都需要在清单里选择工序或者确认&#xff0c; 工序查询的是有效的报工&#xff0c;而确认查询到的是所有报工&#xff0c;包括冲销的报工&#xff0c; 当然也可以在底表中查询&#xff0c;底表包括&am…

迎重阳,话养老:平安养老险如何助力国民“养老梦”?

10月23日&#xff0c;我们将迎来传统节日重阳节&#xff0c;又称敬老节&#xff0c;自古就有祭祖、登高、赏菊三大风俗&#xff0c;流传至今&#xff0c;已成为人们孝老敬老的重要节日。 随着老龄化日益加深&#xff0c;在“敬老”的同时如何“备老”成为人民群众长期热议的话题…

储能PCS的负载测试需求

储能PCS测试应覆盖的最小和最大负载范围&#xff0c;以确保其在不同负载条件下的正常运行&#xff0c;测试时可以逐步增加负载&#xff0c;直到达到最大负载&#xff0c;然后逐步减小负载&#xff0c;直到达到最小负载。测试应涵盖不同类型的负载&#xff0c;例如恒定负载、脉冲…

对于构建自定义协议的思考(Java)

工作转眼也1年时间了&#xff0c;回顾历程&#xff0c;协议占了绝大多数 JSON&#xff08;比较常见的通信文本了&#xff09;&#xff0c;protoBuf&#xff08;小编有写过教程&#xff09;&#xff0c;自定义协议&#xff08;字节拼接&#xff0c;在一些iot领域中的标准几乎都…

【Java网络原理】 四

本文主要介绍了TCP/IP五层协议中的应用层常见的数组组织格式和传输层UDP协议。 一.应用层 1.网络通信数据的实质 网络上传输的数据&#xff0c;本质就是字符串&#xff08;准确的说&#xff0c;是二进制的字符串&#xff09; Java中的各种对象&#xff0c;是无法直接传输的 &…

共享WiFi贴项目地推技巧,轻松学会推广!

共享WiFi贴代理是一种热门的赚钱方式&#xff0c;通过推广共享WiFi贴来获取收益。但要想在竞争激烈的市场中脱颖而出并赚到钱&#xff0c;并不是一件容易的事情。在本文中&#xff0c;我们将介绍一些推广及赚钱的方法。 选择合适的位置是推广共享WiFi贴的关键。你需要选择人流量…

SpringAOP源码解析之advice执行顺序(三)

上一章我们分析了Aspect中advice的排序为Around.class, Before.class, After.class, AfterReturning.class, AfterThrowing.class&#xff0c;然后advice真正的执行顺序是什么&#xff1f;多个Aspect之间的执行顺序又是什么&#xff1f;就是我们本章探讨的问题。 准备工作 既…