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实例
    @Bean
    public 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实例
    @Bean
    public Docket docket() {
//        Docket有很多的配置,我们可以先配置一个apiInfo()
//        apiInfo()里面需要传入一个ApiInfo的参数,那我们就在下面定义一个
      return new Docket(DocumentationType.SWAGGER_2)
              .apiInfo(apiInfo());
    }

//   配置Swagger信息 = apiInfo
    private 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包

    @Bean
    public 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界面,他是直接访问不到的

    @Bean
    public Docket docket(Environment environment) {
//      获取项目的环境
//          这个地方是可变长参数,可以写好几个
        Profiles profiles = Profiles.of("dev","test");
//      如果是dev、test,这个地方的返回值就是true
        boolean 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";
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【宝塔面板部署nodeJs项目】网易云nodeJs部署在云服务器上,保姆级教程,写网易云接口用自己的接口不受制于人

看了很多部署的&#xff0c;要么少步骤&#xff0c;要么就是写的太简洁&#xff0c;对新手不友好 文章目录前言一、下载网易云nodejs项目1. git clone下载&#xff0c;两种方式2. 运行项目二、使用步骤1. 先在本地运行2.测试接口三、部署服务器1. 在宝塔面板安装pm2管理器2. 压…

字符函数和字符串函数【上篇】

文章目录&#x1f396;️1.函数介绍&#x1f4ec;1.1. strlen&#x1f4ec;1.2. strcpy&#x1f4ec;1.3. strcat&#x1f4ec;1.4. strcmp&#x1f4ec;1.5. strncpy&#x1f4ec;1.6. strncat&#x1f4ec;1.7. strncmp&#x1f396;️1.函数介绍 &#x1f4ec;1.1. strlen …

入行 5年,跳槽 3次,我终于摸透了软件测试这行(来自过来人的忠告)

目录 前言 第一年 第二年 第三年 第四年 作为过来人的一些忠告 前言 最近几年行业在如火如荼的发展壮大&#xff0c;以及其他传统公司都需要大批量的软件测试人员&#xff0c;但是20年的疫情导致大规模裁员&#xff0c;让人觉得行业寒冬已来&#xff0c;软件测试人员的职…

【YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进NO.60】损失函数改进为wiou

前言作为当前先进的深度学习目标检测算法YOLOv8&#xff0c;已经集合了大量的trick&#xff0c;但是还是有提高和改进的空间&#xff0c;针对具体应用场景下的检测难点&#xff0c;可以不同的改进方法。此后的系列文章&#xff0c;将重点对YOLOv8的如何改进进行详细的介绍&…

css属性学习

css属性 就是我们选择器里面 { } 中的内容 字体样式 font-size 控制字体大小&#xff1a;单位px&#xff08;像素&#xff09; 默认字体占16个像素 <p style"font-size:30px;">font-size&#xff1a;字体大小&#xff0c;单位的话可以用px表示占的像素个数&…

Mini-Xml 经典实例Demo

欢迎小伙伴的点评✨✨&#xff0c;相互学习、博主将自己研发xml微型服务器的经验与之分享&#x1f30f;&#x1f30f;&#x1f642; 文章目录前言一、使用mxml库编写Xml文件1.1 经典实例Demo_11.2、经典实例Demo_21.3、经典实例Demo_3二、总结前言 本章将会给大家带来mini-xml…

在我的MacBook上捣鼓ESP8266

周三是我们的篮球日&#xff0c;打篮球后总是会有些兴奋&#xff0c;然后就容易睡不着&#xff0c;额&#xff0c;睡不着就拿我的ESP8266开发板出来捣鼓一下。先下载编译工具链https://github.com/espressif/ESP8266_RTOS_SDK下载sdkgit clone https://github.com/espressif/ES…

C++程序在内存中的模型

进程&#xff08;Process&#xff09;是计算机中的程序&#xff0c;数据集合在其上运行的一次活动&#xff0c;是系统进行资源分配的基本单位。每个进程都有自己独立的虚拟内存地址空间&#xff0c;这个虚拟的内存地址空间一般是线性连续的&#xff0c;这个内存地址空间是虚拟的…

面试官想看我写一篇关于“原型链”和“构造函数”深入理解的文章

前言&#xff1a; 在参加工作的面试过程中&#xff0c;我搬出了我的个人掘金账号写在了简历里&#xff0c;面试官很感兴趣&#xff0c;他不仅关注了我的账号&#xff0c;还想让我写一篇《原型链》的见解&#xff0c;由于老早就想总结一篇关于原型的文章&#xff0c;奈何自己刚开…

07平衡负载:gRPC是如何进行负载均衡的?

负载均衡(Load Balance),其含义就是指将请求负载进行平衡、分摊到多个负载单元上进行运行,从而协同完成工作任务。 负载均衡的主要作用: 提升并发性能:负载均衡通过算法尽可能均匀的分配集群中各节点的工作量,以此提高集群的整体的吞吐量。 提供可伸缩性:可添加或减少服…

Springboot新手开发 Cloud篇

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a;个人主页1 || 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;后端专栏 &#x1f4e7;如果文章知识点有错误的地方&#xff0c;…

汇编语言与微机原理(1)基础知识

前言&#xff08;1&#xff09;本人使用的是王爽老师的汇编语言第四版和学校发的微机原理教材配合学习。&#xff08;2&#xff09;推荐视频教程通俗易懂的汇编语言&#xff08;王爽老师的书&#xff09;&#xff1b;贺老师C站账号网址&#xff1b;&#xff08;3&#xff09;文…

在visual studio 2022 C++中配置最新版OpenCV和可能错误解决方案

前面我们写了一篇博文有关在C#中配置OpenCV&#xff0c;但C#版本的OpenCV的学习资源相对较少&#xff0c;C版的和Python版的比较多。这里先说说C版的如何配置吧&#xff01;总共完成四步即可使用起来。 文章目录一、下载并安装OpenCV1、下载OpenCV2、安装OpenCV二、配置环境1、…

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

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

条款20:当std::shared_ptr可能悬空时使用std::weak_ptr

自相矛盾的是&#xff0c;如果有一个像std::shared_ptr&#xff08;见条款19&#xff09;的但是不参与资源所有权共享的指针是很方便的。换句话说&#xff0c;是一个类似std::shared_ptr但不影响对象引用计数的指针。这种类型的智能指针必须要解决一个std::shared_ptr不存在的问…

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

前言 Mysql 我随手造200W条数据&#xff0c;给你们讲讲分页优化 MySql 索引失效、回表解析 今天再聊聊一些我想分享的查询优化相关点。 正文 准备模拟数据。 首先是一张 test_orde 表&#xff1a; CREATE TABLE test_order (id INT(11) NOT NULL AUTO_INCREMENT,p_sn VARCHA…

Spring事务和事务传播机制

目录 Spring中事务的实现 1、通过代码的方式手动实现事务 2、通过注解的方式实现声明式事务 2.1、Transactional作用范围 2.2、Transactional参数说明 2.3、注意事项 2.4、Transactional工作原理 事务隔离级别 1、事务特性 2、Spring中设置事务隔离级别 2.1、MySQL事…

Linux:函数指针做函数参数

#include <stdio.h> #include <stdlib.h> //创建带有函数指针做参数的函数框架api //调用者要先实现回调函数 //调用者再去调用函数框架 //所谓的回调是指 调用者去调用一个带有函数指针做参数的函数框架&#xff0c;函数框架反过来要调用调用者提供的回调函数 …

蓝桥杯冲击-02约数篇(必考)

文章目录 前言 一、约数是什么 二、三大模板 1、试除法求约数个数 2、求约数个数 3、求约数之和 三、真题演练 前言 约数和质数一样在蓝桥杯考试中是在数论中考察频率较高的一种&#xff0c;在省赛考察的时候往往就是模板题&#xff0c;难度大一点会结合其他知识点考察&#x…

全面剖析OpenAI发布的GPT-4比其他GPT模型强在哪里

最强的文本生成模型GPT-4一、什么是GPT-4二、GPT-4的能力三、和其他GPT模型比较3.1、增加了图像模态的输入3.2、可操纵性更强3.3、复杂任务处理能力大幅提升3.4、幻觉、安全等局限性的改善3.6、风险和缓解措施改善更多安全特性3.7、可预测的扩展四、与之前 GPT 系列模型比较五、…