当前位置: 首页 > news >正文

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: dev

application-dev.yaml

server:port: 8081

application-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简介注意点&#xff01; 在正式发布的时候要关闭swagger&#xff08;出于安全考虑&#xff0c;而且节省内存空间&#xff09;之前开发的时候&#xff0c;前端只用管理静态页面&#xff0c; http请求到后端&#xff0c; 模板引擎JSP&#xff0c;故后端是主力如今是前…...

Vue全新一代状态管理库 Pinia【一篇通】

文章目录前言1. Pinia 是什么&#xff1f;1.1 为什么取名叫 Pinia?1.2. 为什么要使用 Pinia ?2. 安装 Pinia2.1.创建 Store2.1.1. Option 类型 Store2.1.2 Setup 函数类型 Store2.1.3 模板中使用3. State 的使用事项&#xff08;Option Store &#xff09;3.1 读取 State3.2 …...

STM32 -4 关于STM32的RAM、ROM

一 stm32 的flash是什么、有什么用、注意事项、如何查看 一 、说明 它主要用于存储代码&#xff0c;FLASH 存储器的内容在掉电后不会丢失&#xff0c;STM32 芯片在运行的时候&#xff0c;也能对自身的内部 FLASH 进行读写&#xff0c;因此&#xff0c;若内部 FLASH 存储了应用…...

第一个 Qt 程序

第一个 Qt 程序 “hello world ”的起源要追溯到 1972 年&#xff0c;贝尔实验室著名研究员 Brian Kernighan 在撰写 “B 语言教程与指导(Tutorial Introduction to the Language B)”时初次使用&#xff08;程序&#xff09;&#xff0c;这是目前已 知最早的在计算机著作中将…...

Spring注解驱动开发--AOP底层原理

Spring注解驱动开发–AOP底层原理 21. AOP-AOP功能测试 AOP&#xff1a;【动态代理】 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式&#xff1b; 1、导入aop模块&#xff1a;Spring AOP&#xff0c;(Spring-aspects) 2、定义一个业务逻辑类(Ma…...

对象的动态创建和销毁以及对象的复制,赋值

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章,「初学」C​​​​​​​ &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才…...

JVM调优,调的是什么?目的是什么?

文章目录前言一、jvm是如何运行代码的&#xff1f;二、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们你们好呀&#xff0c;今天&#xff0c;小雅兰还是在复习噢&#xff0c;今天来给大家介绍一个有意思的题目 题目名称&#xff1a; 猜名次 题目内容&#xff1a; 5位运动员参加了10米台跳水比赛&#xff0c;有人让他们预测比赛结果&#xff1a; A选…...

两年外包生涯,感觉自己废了一半....

先说一下自己的情况。大专生&#xff0c;17年通过校招进入湖南某软件公司&#xff0c;干了接近2年的点点点&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了五年的功能测试…...

【python】喜欢XJJ?这不得来一波大采集?

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 俗话说的好&#xff1a;技能学了~就要用在自己喜欢得东西上&#xff01;&#xff01; 这我不得听个话~我喜欢小姐姐&#xff0c;跳舞的小姐姐 这不得用python把小姐姐舞采集下来~嘿嘿嘿 完整源码、素材皆可点击文章下方名片…...

公司测试员用例写得乱七八糟,测试总监制定了这份《测试用例编写规范》

统一测试用例编写的规范&#xff0c;为测试设计人员提供测试用例编写的指导&#xff0c;提高编写的测试用例的可读性&#xff0c;可执行性、合理性。为测试执行人员更好执行测试&#xff0c;提高测试效率&#xff0c;最终提高公司整个产品的质量。 一、范围 适用于集成测试用…...

LeetCode 热题 HOT 100【题型归类汇总,助力刷题】

介绍 对于算法题&#xff0c;按题型类别刷题才会更有成效&#xff0c;因此我这里在网上搜索并参考了下 “&#x1f525; LeetCode 热题 HOT 100” 的题型归类&#xff0c;并在其基础上做了一定的完善&#xff0c;希望能够记录自己的刷题历程&#xff0c;有所收获&#xff01;具…...

【Java进阶篇】—— File类与IO流

一、File类的使用 1.1 概述 File 类以及本章中的各种流都定义在 java.io 包下 一个File对象代表硬盘或网络中可能存在的一个文件或文件夹&#xff08;文件目录&#xff09; File 能新建、删除、重命名 文件和目录&#xff0c;但 File不能访问文件内容本身。如果我们想要访问…...

Mysql 竟然还有这么多不为人知的查询优化技巧,还不看看?

前言 Mysql 我随手造200W条数据&#xff0c;给你们讲讲分页优化 MySql 索引失效、回表解析 今天再聊聊一些我想分享的查询优化相关点。 正文 准备模拟数据。 首先是一张 test_orde 表&#xff1a; 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-订单管理-列表渲染 目的&#xff1a;完成订单列表默认渲染。 大致步骤&#xff1a; 定义API接口函数抽取单条订单组件获取数据进行渲染 落的代码&#xff1a; 1.获取订单列表API借口 /*** 查询订单列表* param {Number…...

【十二天学java】day01-Java基础语法

day01 - Java基础语法 1. 人机交互 1.1 什么是cmd&#xff1f; 就是在windows操作系统中&#xff0c;利用命令行的方式去操作计算机。 我们可以利用cmd命令去操作计算机&#xff0c;比如&#xff1a;打开文件&#xff0c;打开文件夹&#xff0c;创建文件夹等。 1.2 如何打…...

【面试题】闭包是什么?this 到底指向谁?

一通百通&#xff0c;其实函数执行上下文、作用域链、闭包、this、箭头函数是相互关联的&#xff0c;他们的特性并不是孤立的&#xff0c;而是相通的。因为内部函数可以访问外层函数的变量&#xff0c;所以才有了闭包的现象。箭头函数内没有 this 和 arguments&#xff0c;所以…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...