Springboot集成Swagger
一、Swagger简介
注意点! 在正式发布的时候要关闭swagger(出于安全考虑,而且节省内存空间)
之前开发的时候,前端只用管理静态页面, http请求到后端, 模板引擎JSP,故后端是主力
如今是前后端分离时代:
后端:后端控制层,服务层,数据访问层
前端:前端控制层,视图层
伪造后端数据(JSON格式),便不再需要后端 ,方便了开发,等到前后端都开发完成之后,便不再使用伪造数据,而是访问远程后端接口
前后端如何交互? API文档
前后端相对独立,松耦合,甚至前后端可以部署在不同的服务器上(因为是调用接口,所以在哪个服务器上无所谓)
产生的问题:
前后端继承联调,前端人员和后端人员无法做到及时协商 ----一定要尽早沟通解决
解决方案:
指定计划提纲,实时更新API,降低集成风险
前后端分离之后,后端提供接口,需要实时更新最新的消息及改动
Swagger诞生!!!
官方网站:https://swagger.io/
官方文档:https://github.com/swagger-api/swagger-core/wiki/Annotations
RestFul Api文档在线自动生成工具 =》Api文档与API定义同步更新
直接运行,可以在线测试API接口
支持多种语言
在项目使用Swagger需要springbox:
swagger2
ui
需要上面的两个组件,导入上面的两个坐标
二、spring boot集成Swagger
第一步肯定是创建一个springboot项目,第二步导入maven坐标,万古不变的两步
2.1 maven坐标
如果运行程序的时候出现错误,或许可以将下面swagger-ui依赖和swagger2依赖的版本降低一些,比如说降低到2.7.0
<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency>
<!-- web环境--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.7.RELEASE</version></dependency>如果适用2.7.0还会有错误,建议降低springboot版本号到2.5.0
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.0</version><relativePath/> <!-- lookup parent from repository --></parent>2.2 配置类(Springboot集成)
swagger-ui.html访问不到404,那就降低我们刚刚两个左边的版本,比如改成2.7.0(两个依赖都要改)
如果在启动时出现了其他的方法,也可以尝试将依赖的版本降低一些
下面的这段代码是使用的默认的swagger配置
@Configuration //加入到容器里面
@EnableSwagger2 //开启Swagger
public class SwaggerConfig {}2.3 启动并访问
Swagger UI
下面是效果图

2.4 配置Swagger
Swagger的bean实例Docket
2.4.1 Swagger的bean实例Docket
@Configuration //加入到容器里面
@EnableSwagger2 //开启Swagger
public class SwaggerConfig {// 配置了Swagger的Docket实例@Beanpublic Docket docket() {return new Docket(DocumentationType.SWAGGER_2);}
}2.4.1.1源码解析DocumentationType.SWAGGER_2含义
这个地方为什么传一个他呀?
我们看一下Docket构造器,发现传入DocumentationType类型的参数

我们查看一下DocumentationType类
我们再看一下这些字段,很明显我们是2.0版本,故传入DocumentationType.SWAGGER_2

另外插一句话
在我们还没有配置之前,我们可以先点进这个Docket类中看一下,有一个默认的分组

现在我们在swagger-ui页面上观看一下,具体是对应的哪一部分的信息
很明显是页面右上角的位置

2.4.1.2 源码解析Swagger 配置信息 Docket.ApiInfo
在Docket类中找到下面这个构造方法,并且可以查看一下ApiInfo.DEFAULT,这个就是默认的

下面我们就来看一下这个的源码
在ApiInfo中,我们成功找到这个字段


将这个类往下翻翻,还会发现一个静态代码块:
我们发现静态代码块中的信息和swagger页面的信息是一个样子的,说明这个就是默认的配置,在类编译的时候就会加载(DEFAULT就是在这个地方被赋值的)
static {DEFAULT = new ApiInfo("Api Documentation", "Api Documentation", "1.0", "urn:tos", DEFAULT_CONTACT, "Apache 2.0", "http://www.apache.org/licenses/LICENSE-2.0", new ArrayList());}
上面的这些信息对下的就是swagger-ui页面的下图信息

2.4.1.3 源码解析ApiInfo中的Contact参数
我们在源码中发现

其中DEFAULT_CONTACT是作者信息,如下图所示,发现都是空的

2.4.2 如何替换掉默认ApiInfo?
下面我们将这个配置改一下,如下代码所示
@Configuration //加入到容器里面
@EnableSwagger2 //开启Swagger
public class SwaggerConfig {// 配置了Swagger的Docket实例@Beanpublic Docket docket() {
// Docket有很多的配置,我们可以先配置一个apiInfo()
// apiInfo()里面需要传入一个ApiInfo的参数,那我们就在下面定义一个return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());}// 配置Swagger信息 = apiInfoprivate ApiInfo apiInfo(){
// 下面的这套配置就把原来的static代码块覆盖掉
// 作者信息,通过查看源码得知Contact contact = new Contact("张靖奇", "https://blog.kuangstudy.com/", "1149345976@qq.com");return new ApiInfo("张靖奇的API文档","练习!!!!!!!","v1.0","https://blog.kuangstudy.com/",contact,"Apache 2.0","http://www.apache.org/licenses/LICENSE-2.0",new ArrayList());}
}之前的效果图:

如今的效果图:
假如说出不来下面的效果图,仍然是上面的效果图,给浏览器清理缓存再刷新即可

备注:这个框框圈出来的东西,至于文档名和描述信息有用,其他的没有用
2.4.3 Swagger配置扫描接口 Docket.select
我们再select()之后继续加点,我们发现只能再加上apis,paths

2.4.3.1 扫描指定的包
指定扫描com.example.controller包
@Beanpublic Docket docket() {
// Docket有很多的配置,我们可以先配置一个apiInfo()
// apiInfo()里面需要传入一个ApiInfo的参数,那我们就在下面定义一个return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
// select()参数里面需要传入一个Docket,可以返回一个ApiSelectorBuilder.select()
// RequestHandlerSelectors,配置要扫描接口的方式
// basePackage("com.example") 指定扫描这个包.apis(RequestHandlerSelectors.basePackage("com.example.controller")).build();}
2.4.3.2 扫描全部的包
.apis(RequestHandlerSelectors.any())2.4.3.3 都不扫描
.apis(RequestHandlerSelectors.none())2.4.3.4 扫描类上的注解
.apis(RequestHandlerSelectors.withClassAnnotation(Api.class))2.4.3.5 扫描方法上的注解
.apis(RequestHandlerSelectors.withMethodAnnotation(GetMapping.class))2.4.3.6 过滤路径

ant() 过滤路径的
表示在com.example.controller包下的路径为/kuang开头的所有请求
.apis(RequestHandlerSelectors.basePackage("com.example.controller"))
.paths(PathSelectors.ant("/kuang/**"))any()全部都过滤
none()全部都不过滤
regex()根据正则表达式过滤
2.4.4 配置是否启动Swagger
查看Docket源码,发现有一个enabed
默认为true,表示启动Swagger
如果为false,则Swagger不能在浏览器中访问

我们也可以把这个值改成false

注意!! 这个点的时候,一定不要在build()后面点(从select到build是一套的)
此时重启之后访问不到页面

2.4.4.1 希望Swagger在生产环境中使用但发布时不适用
判断是不是生产环境 flag=false
注入enable(flag)
多配置是怎么来的?怎么确定是生产环境还是发布环境?

acceptsProfiles(Profiles profiles) 监听,返回boolean,其中Profiles是org.springframework.core.env
getDefaultProfiles() 获得默认的文件名,返回String[]
getActiveProfiles() 获得激活的文件名,返回String[]
如下代码所示,我们配置的是当在dev,test这两个版本下才能进入到swagger,重启刷新swagger-ui界面,他是直接访问不到的
@Beanpublic Docket docket(Environment environment) {
// 获取项目的环境
// 这个地方是可变长参数,可以写好几个Profiles profiles = Profiles.of("dev","test");
// 如果是dev、test,这个地方的返回值就是trueboolean flag = environment.acceptsProfiles(profiles);// Docket有很多的配置,我们可以先配置一个apiInfo()
// apiInfo()里面需要传入一个ApiInfo的参数,那我们就在下面定义一个return new Docket(DocumentationType.SWAGGER_2).enable(flag).apiInfo(apiInfo())
// select()参数里面需要传入一个Docket,可以返回一个ApiSelectorBuilder.select().apis(RequestHandlerSelectors.basePackage("com.example.controller")).build();}此时我们修改一下application.yaml文件,以及新增两个配置文件
application.yaml
#激活环境
spring:profiles:active: devapplication-dev.yaml
server:port: 8081application-pro.yaml
server:port: 8082修改及添加之后,再次访问页面,这次如果我们用8080端口是访问不到的,因为我们在application中配置的是dev环境,此时会直接向application-dev文件寻找,成为8081端口

2.4.5 配置Api文档的分组


2.4.5.1 配置多个组
配置多个Docket然后点就行

2.5 实体类配置
只要我们的接口中的返回值存在实体类,就会被扫描到Swagger(前提是Swagger会扫描到所在的包,一定看好范围)
@RestController
@RequestMapping("/test")
@Api(value = "测试一下")
public class TestController {@GetMapping("/userinfo")@ApiOperation("获取用户列表信息")public User getUserInfo(){User user = new User();return user;}
}
public class User {public String user;public String password;
}效果如下图所示:

但是上边的都是英文,一般人会看不懂,但是我们可以加一些中文备注,这些中文备注就需要用到下面的注解

2.5.1 @ApiModel 与@ApiProperty
(31条消息) @ApiModel注解与@ApiModelProperty注解_我爱布朗熊的博客-CSDN博客
2.5.2 @ApiOperation
这个注解的作用就是给接口加了一个中文注释而已
@GetMapping("/userinfo")@ApiOperation("获取用户列表信息")public User getUserInfo(){User user = new User("aaa","aaaaa");return user;}
2.5.3 @ApiParam
@GetMapping("/hello2")public String hello2(@ApiParam("用户名") String username){return "hello";}
相关文章:
Springboot集成Swagger
一、Swagger简介注意点! 在正式发布的时候要关闭swagger(出于安全考虑,而且节省内存空间)之前开发的时候,前端只用管理静态页面, http请求到后端, 模板引擎JSP,故后端是主力如今是前…...
Vue全新一代状态管理库 Pinia【一篇通】
文章目录前言1. Pinia 是什么?1.1 为什么取名叫 Pinia?1.2. 为什么要使用 Pinia ?2. 安装 Pinia2.1.创建 Store2.1.1. Option 类型 Store2.1.2 Setup 函数类型 Store2.1.3 模板中使用3. State 的使用事项(Option Store )3.1 读取 State3.2 …...
STM32 -4 关于STM32的RAM、ROM
一 stm32 的flash是什么、有什么用、注意事项、如何查看 一 、说明 它主要用于存储代码,FLASH 存储器的内容在掉电后不会丢失,STM32 芯片在运行的时候,也能对自身的内部 FLASH 进行读写,因此,若内部 FLASH 存储了应用…...
第一个 Qt 程序
第一个 Qt 程序 “hello world ”的起源要追溯到 1972 年,贝尔实验室著名研究员 Brian Kernighan 在撰写 “B 语言教程与指导(Tutorial Introduction to the Language B)”时初次使用(程序),这是目前已 知最早的在计算机著作中将…...
Spring注解驱动开发--AOP底层原理
Spring注解驱动开发–AOP底层原理 21. AOP-AOP功能测试 AOP:【动态代理】 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式; 1、导入aop模块:Spring AOP,(Spring-aspects) 2、定义一个业务逻辑类(Ma…...
对象的动态创建和销毁以及对象的复制,赋值
🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C 🔥座右铭:“不要等到什么都没有了,才…...
JVM调优,调的是什么?目的是什么?
文章目录前言一、jvm是如何运行代码的?二、jvm的内存模型1 整体内存模型结构图2 堆中的年代区域划分3 对象在内存模型中是如何流转的?4 什么是FULL GC,STW? 为什么会发生FULL GC?5 要调优,首先要知道有哪些垃圾收集器及哪些算法6 调优不是盲目的,要有依据,几款内…...
docker部署zabbix监控
docker部署zabbix监控 1、环境说明 公有云ubuntu22.04 系统->部署docker环境zabbix-server 6.4 2、准备docker环境 更新apt以及安装一些必要的系统工具 sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-co…...
C语言刷题(6)(猜名次)——“C”
各位CSDN的uu们你们好呀,今天,小雅兰还是在复习噢,今天来给大家介绍一个有意思的题目 题目名称: 猜名次 题目内容: 5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果: A选…...
两年外包生涯,感觉自己废了一半....
先说一下自己的情况。大专生,17年通过校招进入湖南某软件公司,干了接近2年的点点点,今年年上旬,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了五年的功能测试…...
【python】喜欢XJJ?这不得来一波大采集?
前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 俗话说的好:技能学了~就要用在自己喜欢得东西上!! 这我不得听个话~我喜欢小姐姐,跳舞的小姐姐 这不得用python把小姐姐舞采集下来~嘿嘿嘿 完整源码、素材皆可点击文章下方名片…...
公司测试员用例写得乱七八糟,测试总监制定了这份《测试用例编写规范》
统一测试用例编写的规范,为测试设计人员提供测试用例编写的指导,提高编写的测试用例的可读性,可执行性、合理性。为测试执行人员更好执行测试,提高测试效率,最终提高公司整个产品的质量。 一、范围 适用于集成测试用…...
LeetCode 热题 HOT 100【题型归类汇总,助力刷题】
介绍 对于算法题,按题型类别刷题才会更有成效,因此我这里在网上搜索并参考了下 “🔥 LeetCode 热题 HOT 100” 的题型归类,并在其基础上做了一定的完善,希望能够记录自己的刷题历程,有所收获!具…...
【Java进阶篇】—— File类与IO流
一、File类的使用 1.1 概述 File 类以及本章中的各种流都定义在 java.io 包下 一个File对象代表硬盘或网络中可能存在的一个文件或文件夹(文件目录) File 能新建、删除、重命名 文件和目录,但 File不能访问文件内容本身。如果我们想要访问…...
Mysql 竟然还有这么多不为人知的查询优化技巧,还不看看?
前言 Mysql 我随手造200W条数据,给你们讲讲分页优化 MySql 索引失效、回表解析 今天再聊聊一些我想分享的查询优化相关点。 正文 准备模拟数据。 首先是一张 test_orde 表: CREATE TABLE test_order (id INT(11) NOT NULL AUTO_INCREMENT,p_sn VARCHA…...
MATLAB算法实战应用案例精讲-【智能优化算法】海洋捕食者算法(MPA) (附MATLAB和python代码实现)
目录 前言 知识储备 Lvy 飞行 布朗运动 算法原理 算法思想 数学模型...
Spring @Profile
1. Overview In this tutorial, we’ll focus on introducing Profiles in Spring. Profiles are a core feature of the framework — allowing us to map our beans to different profiles — for example, dev, test, and prod. We can then activate different profiles…...
Vue3电商项目实战-个人中心模块4【09-订单管理-列表渲染、10-订单管理-条件查询】
文章目录09-订单管理-列表渲染10-订单管理-条件查询09-订单管理-列表渲染 目的:完成订单列表默认渲染。 大致步骤: 定义API接口函数抽取单条订单组件获取数据进行渲染 落的代码: 1.获取订单列表API借口 /*** 查询订单列表* param {Number…...
【十二天学java】day01-Java基础语法
day01 - Java基础语法 1. 人机交互 1.1 什么是cmd? 就是在windows操作系统中,利用命令行的方式去操作计算机。 我们可以利用cmd命令去操作计算机,比如:打开文件,打开文件夹,创建文件夹等。 1.2 如何打…...
【面试题】闭包是什么?this 到底指向谁?
一通百通,其实函数执行上下文、作用域链、闭包、this、箭头函数是相互关联的,他们的特性并不是孤立的,而是相通的。因为内部函数可以访问外层函数的变量,所以才有了闭包的现象。箭头函数内没有 this 和 arguments,所以…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
