Springboot基础学习之(二十一):Swagger基础学习(swagger信息介绍,配置扫描接口和开关,分组和接口注释)

news2024/11/25 10:54:23

什么是Swagger?

Swagger2是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful 风格的Web 服务

使用Swagger你只需要按照它的规范去定义接口及接口相关的信息。再通过Swagger衍生出来的一系列项目和工具,就可以做到生成各种格式的接口文档,生成多种语言的客户端和服务端的代码,以及在线接口调试页面等等。这样,如果按照新的开发模式,在开发新版本或者迭代版本的时候,只需要更新Swagger描述文件,就可以自动生成接口文档和客户端服务端代码,做到调用端代码、服务端代码以及接口文档的一致性。

为什么要使用Swagger?

1:Swagger可以实现注释信息的添加,帮助我们更好的了解到接口信息

2:可以实现接口文档的实时更新

3:通过Swagger接口可以实现在线测试与app postman相似

实施Swagger结构

一:创建一个springboot项目环境(web)

二:导入swagger2需要使用的依赖

    
        <dependencies>
        <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>3.0.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>3.0.0</version>
        </dependency>
        <!--运行环境-->
        <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-boot-starter</artifactId>
        <version>3.0.0</version>
        </dependency>

三:在配置文件对路径进行配置

Springboot2.6以后将SpringMVC 默认路径匹配策略从AntPathMatcher 更改为PathPatternParser,导致出错


spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER

Swagger页面的路径

package springfox.boot.starter.autoconfigure;

import org.springframework.util.StringUtils;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

// tag::swagger-ui-configurer[]
public class SwaggerUiWebMvcConfigurer implements WebMvcConfigurer {
  private final String baseUrl;

  public SwaggerUiWebMvcConfigurer(String baseUrl) {
    this.baseUrl = baseUrl;
  }

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    String baseUrl = StringUtils.trimTrailingCharacter(this.baseUrl, '/');
    registry.
        addResourceHandler(baseUrl + "/swagger-ui/**")
        .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")
        .resourceChain(false);
  }

  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController(baseUrl + "/swagger-ui/")
        .setViewName("forward:" + baseUrl + "/swagger-ui/index.html");
  }
}
// end::swagger-ui-configurer[]

 

由SwaggerUiWebMvcConfigurer类可知我们要访问上图中index页面

路径为:http://localhost:8080/swagger-ui/index.html

注意:一定要查看依赖中的路径配置,因为不同版本的swagger导致index页面不一样和访问路径也可能不同

四:启动swagger:定义个类swagger_config实现swagger功能的开启

@Configuration
@EnableSwagger2
public class swagger_config {

}

 

执行项目:访问swagger后台界面

这个界面就是swagger2的后台界面,可以从这里看到关于后端配置的一些信息。以及通过此页面可以进行在线测试,测试网页的实现是否出现Bug 

配置swagger:在swagger_config类进行配置

修改这个网页上的输出内容



@Configuration
@EnableSwagger2
public class swagger_config {


    @Bean
    public Docket docket(){
        
        return new Docket(DocumentationType.SWAGGER_2).groupName("不想").apiInfo(apiInfo());


    }
    private ApiInfo apiInfo(){
        Contact contact = new Contact("不想睡醒的梦", "https://blog.csdn.net/m0_52479012?spm=1000.2115.3001.5343", "2602499389@qq.com");
        return new ApiInfo("不想睡醒的梦",
                "不想睡醒的梦",
                "不想睡醒的梦",
                "https://blog.csdn.net/m0_52479012?spm=1000.2115.3001.5343",
                contact, "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList());
    }
}

运行项目查看网页显示的内容是否发生改变

这就是配置完成后的内容

如何查看后端的访问

创建一个controller类,定义个方法访问

@RestController
public class Mycontroller1 {

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

看看在swagger页面是否显示信息

 

获取到方法如何在这个网页实现在线测试呢?

点击绿色框

点击蓝色按钮 

 

 点击Excute按钮

然后出现的内容就是这个域名访问的具体信息

 配置swagger扫描的接口以及开关

进行组的配置

在实际的开发过程中,一个swagger页面不可能只有一个人进行使用,所以要设置多个组


@Configuration
@EnableSwagger2
public class swagger_config {

    @Bean
    public Docket docket1(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("A");

    }
    @Bean
    public Docket docket2(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("b");

    }
    @Bean
    public Docket docket3(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("v");

    }
}

 可以在不同组进行不同的配置信息

 配置扫描接口:在docket容器中实现配置

主要的配置信息就一行代码

 

RequestHandlerSelectors配置要扫描接口的方式
basePackage设置扫描包的位置
any都进行扫描
none全都不进行扫描
.withClassAnnotation(Controller.class) 扫描类上的注解
withMethodAnnotation(GetMapping.class)扫描方法上的注解

 完整代码



@Configuration
@EnableSwagger2
public class swagger_config {

    @Bean
    public Docket docket1(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("A");

    }
    @Bean
    public Docket docket2(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("b");

    }
    @Bean
    public Docket docket3(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("v");

    }
    @Bean
    public Docket docket(Environment environment){
        return new Docket(DocumentationType.SWAGGER_2).groupName("不想睡醒的梦").apiInfo(apiInfo())
//              .enable(true)    //控制swagger是否开启
                .select()
                .apis(RequestHandlerSelectors.none())
                //paths过滤ant则是指定路径进行过滤
//                .paths(PathSelectors.ant("/demo/**"))
                .build();
    }
    private ApiInfo apiInfo(){
        Contact contact = new Contact("不想睡醒的梦", "https://blog.csdn.net/m0_52479012?spm=1000.2115.3001.5343", "2602499389@qq.com");
        return new ApiInfo("不想睡醒的梦",
                "不想睡醒的梦",
                "不想睡醒的梦",
                "https://blog.csdn.net/m0_52479012?spm=1000.2115.3001.5343",
                contact, "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList());
    }
}

接口的配置决定我们能够获取到怎么样的配置内容

当前组( 不想睡醒的梦)接口现在的配置为None

运行项目

 没有任何的信息

但当我们切换组时

 发现不同组配置不同,出现的内容不同这就是组所带来的好处

通过.enable控制swagger的开关

在v这个组关闭swagger功能

    @Bean
    public Docket docket3(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("v")
                .enable(false);

    }

关闭就不进行显示 

 全都关闭又是怎样的呢?

 除了开关和扫描配置还有一个关键配置:过滤

将指定文件给过滤调,不进行扫描

没有进行过滤配置之前

 配置代码:

    @Bean
    public Docket docket(Environment environment){

        return new Docket(DocumentationType.SWAGGER_2).groupName("不想睡醒的梦").apiInfo(apiInfo())

                .select()
                .apis(RequestHandlerSelectors.any())
//                paths过滤ant则是指定路径进行过滤
                .paths(PathSelectors.ant("/demo/**"))
                .build();
    }

没有扫描到能够使用的API:将内容成功过滤

如何动态配置当项目处于test、dev环境时显示swagger,处于prod时不显示? 

还是在Docket容器中进行配置(dev和test环境可以进行访问)

    @Bean
    public Docket docket(Environment environment){
        Profiles of = Profiles.of("dev", "test");
        //设置要显示的环境
        boolean b = environment.acceptsProfiles(of);
        return new Docket(DocumentationType.SWAGGER_2).groupName("不想睡醒的梦").apiInfo(apiInfo())
                .enable(b)    //控制swagger是否开启
                .select()
                .apis(RequestHandlerSelectors.any())

                .build();
    }

环境搭建

 当前环境为dev访问swagger

 访问成功

修改环境

 

 禁止访问,配置成功

配置实体类:如何被扫描到显示在swagger中

创建一个实现类

package com.swagger.demo.pojo;


import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

@ApiModel("用户参数类")          //注解:类型解释
public class user {
    @ApiModelProperty("用户名")   //未定义的属性,添加一个注解
    public String name;
    @ApiModelProperty("属性id")

    public String id;
}

创建一个接口并映射在这个实体类上

    @GetMapping("/user")
    public user swagger1(){
        return new user();
    }

注意:

注:并不是因为@ApiModel这个注解让实体显示在这里了,而是只要出现在接口方法的返回值上的实体都会显示在这里,而@ApiModel和@ApiModelProperty这两个注解只是为实体添加注释的。

@ApiModel为类添加注释

@ApiModelProperty为类属性添加注释

实体类添加成功: 

 

 关于swagger常用注解

 除此只要还可以在接口中进行注解解释

    @ApiOperation("你好")    //默认注释是方法名,如果添加这个注解,进行替换
    @GetMapping("/hello")
    public String hello(@ApiParam("用户名") String name){
        return "hello"+name;
    }

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

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

相关文章

Flutter 滚动组件ListView,GridView,Sliver以及滚动监听

前言 身是菩提树 心是明镜台 时时勤拂拭 模式染尘埃 这玩意不难&#xff0c;就是东西多。。。 1 看一下继承关系 class GridView extends BoxScrollView abstract class BoxScrollView extends ScrollView abstract class ScrollView extends StatelessWidget 2 下面是scr…

set和map

set和map关联式容器键值对树状结构关联式容器set介绍使用multiset介绍使用map介绍使用multimap介绍使用底层容器AVL树概念操作节点定义插入旋转红黑树&#xff08;RBTree&#xff09;概念节点的设计迭代器的设计结构插入红黑树模拟实现set与map模拟实现map模拟实现set关联式容器…

【Java 数据结构】单向链表和双向链表的实现 (LinkedList)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

android studio 页面布局(2)

<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools"http://schemas.android.com/too…

【数据挖掘与商务智能决策】第九章 随机森林模型

9.1.3 随机森林模型的代码实现 和决策树模型一样&#xff0c;随机森林模型既可以做分类分析&#xff0c;也可以做回归分析。 分别对应的模型为随机森林分类模型&#xff08;RandomForestClassifier&#xff09;及随机森林回归模型&#xff08;RandomForestRegressor&#xff…

Vue.js 2.0 组件

什么是组件&#xff1f; 组件&#xff08;Component&#xff09;是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素&#xff0c;封装可重用的代码。在较高层面上&#xff0c;组件是自定义元素&#xff0c; Vue.js 的编译器为它添加特殊功能。在有些情况下&#xff0c;组件也…

《花雕学AI》19:比较ChatGPT与新Bing在文章润色方面的应用优势与测试案例

引言&#xff1a; 文章润色是指对已经写好的文章进行修改、优化或完善的过程&#xff0c;以提高文章的质量和效果。文章润色涉及到多方面的内容&#xff0c;如语言表达、逻辑结构、文献引用、格式规范等。文章润色对于提升写作水平、提高论文发表率、增加学术影响力等都有重要意…

JavaScript【趣味】做一个网页版2048

文章目录&#x1f31f;前言&#x1f31f;先看效果&#xff08;粉丝特权哈哈&#xff09;&#x1f31f;代码实现&#x1f31f;页面布局 【index.html】&#x1f31f;样式文件【2048.css】&#x1f31f;index.html 里用到的JS文件&#x1f31f;jquery.min.js&#x1f31f;util.js…

300元左右的蓝牙耳机哪个好?300左右音质最好的蓝牙耳机

无线耳机是人们日常生活中必不可少的设备&#xff0c;无论是听音乐化石看电影都能获得身临其境的感觉&#xff0c;由于科技真在发展中&#xff0c;不断地的发生变化&#xff0c;百元价位就可以感受到不错的音色&#xff0c;下面小编整理了几款300左右音质表现不错的蓝牙耳机。 …

Linux 、Android将在汽车舞台上开战

导读在 CES 2017 上&#xff0c;AGL 宣布&#xff0c;Mercedes-Benz 的母公司 Daimler 正式加入。这是第十家汽车制造商加入 AGL&#xff0c;也是第一家德国公司加入 AGL。AGL&#xff08;Automotive Grade Linux&#xff09;&#xff0c;是 Linux 基金会的一个相互协作的开源组…

mallox勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

目录 前言&#xff1a; 一、mallox勒索病毒及xollam勒索病毒的特点 二、mallox勒索病毒及xollam勒索病毒的影响 三、mallox勒索病毒及xollam勒索病毒数据恢复服务 四、mallox勒索病毒及xollam勒索病毒加密数据库恢复案例 五、以下是预防mallox勒索病毒及xollam勒索病毒安全…

解读CANDT测试项-采样点测试

原标题&#xff1a;解读CANDT测试项-采样点测试 一、为什么要进行采样点测试&#xff1f; 本文引用地址&#xff1a;http://www.eepw.com.cn/article/202004/411611.htm 为了保证有效的通信&#xff0c;对于一个只有两个节点的CAN网络&#xff0c;其两边距离不超过最大的传输…

day12 共享内存(内存映射的使用、注意事项、进程间通信、systemV共享内存)

内存映射的基本使用 概念&#xff1a; 功能共享内存可以通过mmap&#xff08;&#xff09;映射普通文件。 是一个磁盘文件与内存中的一个缓冲区相映射&#xff0c;进程可以像访问普通内存一样对文件进行访问&#xff0c;不必在调用read 、write。 mmap&#xff08;&#xf…

ChatGPT 与 MindShow 一分钟搞定一个PPT

前言 PPT制作是商务、教育和各种场合演讲的重要组成部分。然而&#xff0c;很多人会花费大量时间和精力在内容生成和视觉设计方面。为了解决这个问题&#xff0c;我们可以利用两个强大的工具——ChatGPT和MindShow&#xff0c;来提高制作PPT的效率。 一、ChatGPT 与 MindShow…

JUC-01 线程的创建和状态转换

本次我们主要讲三个问题 线程是什么&#xff1f;线程有哪些状态&#xff1f;各状态间的转换了解吗&#xff1f;创建线程的3种方法你都了解吗&#xff1f; 1. 线程是什么&#xff1f;&#xff08;了解即可&#xff09; 进程&#xff1a; 进程是一个具有一定独立功能的程序在一…

四次挥手刨根问底19问详解,全网最全

1.请描述一下TCP连接的四次挥手过程&#xff1f; 回答&#xff1a;TCP连接的四次挥手过程包括以下步骤&#xff1a; 步骤1&#xff1a;客户端向服务器端发送一个FIN报文段&#xff0c;请求关闭连接。 步骤2&#xff1a;服务器端收到FIN报文段后&#xff0c;向客户端发送一个…

python列表,元组和字典

1、python列表 1.1.列表的定义 list是一种有序的集合、基于 链表实现,name[ ] ,全局定义:list2list([ ])。 1.2下标索引 python不仅有负索引也有正索引。正索引从0开始,负索引从-1开始。这两个可以混用,但指向还是那个位置 a[0]a[-9]//length为10的数组a1.3列表的切片 列表可…

navicat如何使用orcale(详细步骤)

目录前言操作1.连接数据库2.建库问题总结前言 看过我昨天文章的兄弟姐妹都知道最近接手另一个国企项目&#xff0c;数据库用的是orcale。实话实说&#xff0c;也有快三年没用过orcale数据库了。 这期间问题不断&#xff0c;因为orcale日渐消沉&#xff0c;网上资料也是真真假…

UE4 回放系统升级到UE5之后的代码报错问题解决

关键词&#xff1a; UE4 回放系统 升级 UE5 报错 DemoNetDriver GetDemoCurrentTime GetDemoTotalTime 背景 照着网上教的UE4的回放系统&#xff0c;也叫重播系统&#xff0c;英文Replay。做完了&#xff0c;测试运行正常&#xff0c;可升级到UE5却报了一堆 WorldSetting 和 …

(20230417)最大数合并区间重新排列单词间的空格 按奇偶排序数组 II 数组形式的整数加法

最大数&#xff08;回顾等级&#xff1a;值得&#xff0c;已达最优解&#xff09; 来源&#xff1a;自己LeetCode刷题 usa long cmp(const void* e1, const void* e2) {int* p1(int*)e1;int* p2(int*)e2;long n110;long n210;while(*p1>n1){n1*10;}while(*p2>n2){n2*1…