Spring Boot之Swagger

news2024/10/8 18:29:09

文章目录

  • 零 项目源码
  • 一 Swagger简介
  • 二 Spring Boot集成Swagger
    • 2.1 环境准备
    • 2.2 配置Swagger
    • 2.3 配置文档信息
    • 2.4 配置扫描接口
    • 2.5 配置开关Swagger
    • 2.6 配置API分组
    • 2.7 配置实体类
    • 2.8 常用注解


在这里插入图片描述

零 项目源码

  • Swagger源码免费下载

一 Swagger简介

  • Swagger官网
  • swagger是一款可以根据resutful风格生成的生成的接口开发文档,并且支持做测试的一款中间软件。
  • Swagger是一款RESTFUL接口的文档在线自动生成+功能测试功能软件
  • Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。
  • 目标:使客户端和文件系统作为服务器以同样的速度来更新文件的方法,参数和模型紧密集成到服务器。
  • 支持多种语言 (如:Java,PHP等)
  • 注意:在正式环境要记得关闭Swagger,一方面出于安全考虑,另一方方面可以节省运行时内存

二 Spring Boot集成Swagger

2.1 环境准备

  • 合适的版本匹配
    • JDK1.8+
    • spring boot 2.5.6/2.5.7
    • springfox-swagger-ui 2.9.2
    • springfox-swagger2 2.9.2
       <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
      <dependency>
          <groupId>io.springfox</groupId>
          <artifactId>springfox-swagger2</artifactId>
          <version>2.9.2</version>
      </dependency>
      
      <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
      <dependency>
          <groupId>io.springfox</groupId>
          <artifactId>springfox-swagger-ui</artifactId>
          <version>2.9.2</version>
      </dependency>
      
  • 否则会出现版本冲突出现空指针异常问题
    Failed to start bean 'documentationPluginsBootstrapper'; 
    nested exception is java.lang.NullPointerException
    

2.2 配置Swagger

  1. 编写HelloController类,进行测试
    @RestController
    public class HelloController {
        @RequestMapping("/hello")
        public String hello() {
            return "Hello";
        }
    }
    
    在这里插入图片描述
  2. 编写配置类SwaggerConfig
    @Configuration //配置类
    @EnableSwagger2// 开启Swagger2的自动配置
    public class SwaggerConfig {
    
    }
    
    在这里插入图片描述

2.3 配置文档信息

  1. 配置Docket实例
    • Swagger实例Bean是Docket,所以通过配置Docket实例来配置Swaggger
    //配置docket以配置Swagger具体参数
    @Bean 
    public Docket docket() {
    	return new Docket(DocumentationType.SWAGGER_2);
    }
    
  2. 配置ApiInfo属性文档信息
    //配置swagger文档信息apiInfo
        private ApiInfo apiInfo() {
            //作者信息
            Contact contact = new Contact("缘友一世", "https://www.csdn.net/", "xxxxxxxxx@qq.com");
            return new ApiInfo(
                    "Spring Boot集成Swagger",//标题
                    "学习Swagger",//描述
                    "1.0",//版本
                    "http://localhost",//组织连接
                    contact,//联系人信息
                    "Apache 2.0",//许可
                    "http://www.apache.org/licenses/LICENSE-2.0",//许可连接
                    new ArrayList());//拓展
        }
    
    • 记得修改Docket的内容
    @Bean 
    public Docket docket() {
    	return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());
    }
    
    在这里插入图片描述

2.4 配置扫描接口

  1. 通过select()方法配置扫描接口
    @Bean
    public Docket docket() {
    	return new Docket(DocumentationType.SWAGGER_2)
    	.apiInfo(apiInfo())
    	// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
    	.select()
    	//RequestHandlerSelectors 配置扫描接口的方式
        //basePackage():扫描指定的包 [主流]
        //any():扫描全部
        //none():不扫描
        //withClassAnnotation():扫描类上的注解 参数为注解的反射对象
        //withMethodAnnotation():扫描方法上的注解
        //.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
        .apis(RequestHandlerSelectors.basePackage("com.yang.controller"))
    	.build();
    }
    
    在这里插入图片描述
  2. 配置接口扫描过滤
     @Bean
    public Docket docket1() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .groupName("A")
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.yang.controller"))
                //过滤路径
                /*
                    any() // 任何请求都扫描
                    none() // 任何请求都不扫描
                    regex(final String pathRegex) // 通过正则表达式控制
                    ant(final String antPattern) // 通过ant()控制
                 */
                .paths(PathSelectors.ant("/yang/**"))
                .build();
    }
    
    在这里插入图片描述

2.5 配置开关Swagger

  1. enable()方法,配置是否开启swagger

    @Bean
    public Docket docket() {
    	return new Docket(DocumentationType.SWAGGER_2)
    	.apiInfo(apiInfo())
    	.enable(false) //配置是否启用Swagger,如果是false,在浏览器将无法访问
    	.select()// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
    	.apis(RequestHandlerSelectors.basePackage("com.yang.controller"))
    	// 配置如何通过path过滤,即这里只扫描请求以/kuang开头的接口
    	.paths(PathSelectors.ant("/yang/**"))
    	.build();
    }
    
  2. 由项目环境动态配置swagger

    • spring配置文件
    #application.properties
    spring.profiles.active=pro
    #application-dev.properties
    server.port=8081
    #application-pro.properties
    server.port=8080
    
    //配置了swagger的docket的bean实例
    //enable 是否开启swagger
    @Bean
    public Docket docket(Environment environment) {
        //设置要显示的Swagger环境
        Profiles profiles = Profiles.of("dev", "test");
        //获取项目的环境
        //通过environment.acceptsProfiles判断是否处于设定的环境中
        boolean flag = environment.acceptsProfiles(profiles);
    
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .enable(flag)
                .groupName("缘友一世")
                .select()
                //RequestHandlerSelectors 配置扫描接口的方式
                //basePackage():扫描指定的包 [主流]
                //any():扫描全部
                //none():不扫描
                //withClassAnnotation():扫描类上的注解 参数为注解的反射对象
                //withMethodAnnotation():扫描方法上的注解
                //.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                .apis(RequestHandlerSelectors.basePackage("com.yang.controller"))
                //过滤路径
                /*
                    any() // 任何请求都扫描
                    none() // 任何请求都不扫描
                    regex(final String pathRegex) // 通过正则表达式控制
                    ant(final String antPattern) // 通过ant()控制
                 */
                .paths(PathSelectors.ant("/yang/**"))
                .build();
    }
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.env.Environment;
    import org.springframework.core.env.Profiles;
    import springfox.documentation.builders.PathSelectors;
    import springfox.documentation.builders.RequestHandlerSelectors;
    import springfox.documentation.service.ApiInfo;
    import springfox.documentation.service.Contact;
    import springfox.documentation.spi.DocumentationType;
    import springfox.documentation.spring.web.plugins.Docket;
    import springfox.documentation.swagger2.annotations.EnableSwagger2;
    
    import java.util.ArrayList;
    
    /**
     * @author 缘友一世
     * date 2023/1/27-21:25
     */
    @Configuration
    //开启swagger2
    @EnableSwagger2
    public class SwaggerConfig {
    
        @Bean
        public Docket docket1() {
            return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo())
                    .groupName("A")
                    .select()
                    .apis(RequestHandlerSelectors.basePackage("com.yang.controller"))
                    //过滤路径
                    /*
                        any() // 任何请求都扫描
                        none() // 任何请求都不扫描
                        regex(final String pathRegex) // 通过正则表达式控制
                        ant(final String antPattern) // 通过ant()控制
                     */
                    .paths(PathSelectors.ant("/yang/**"))
                    .build();
        }
        @Bean
        public Docket docket2() {
            return new Docket(DocumentationType.SWAGGER_2)
                    .groupName("B");
        }
        @Bean
        public Docket docket3() {
            return new Docket(DocumentationType.SWAGGER_2).groupName("C");
        }
        //配置了swagger的docket的bean实例
        //enable 是否开启swagger
        @Bean
        public Docket docket(Environment environment) {
            //设置要显示的Swagger环境
            Profiles profiles = Profiles.of("dev", "test");
            //获取项目的环境
            //通过environment.acceptsProfiles判断是否处于设定的环境中
            boolean flag = environment.acceptsProfiles(profiles);
    
            return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo())
                    .enable(flag)
                    .groupName("缘友一世")
                    .select()
                    //RequestHandlerSelectors 配置扫描接口的方式
                    //basePackage():扫描指定的包 [主流]
                    //any():扫描全部
                    //none():不扫描
                    //withClassAnnotation():扫描类上的注解 参数为注解的反射对象
                    //withMethodAnnotation():扫描方法上的注解
                    //.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                    .apis(RequestHandlerSelectors.basePackage("com.yang.controller"))
                    //过滤路径
                    /*
                        any() // 任何请求都扫描
                        none() // 任何请求都不扫描
                        regex(final String pathRegex) // 通过正则表达式控制
                        ant(final String antPattern) // 通过ant()控制
                     */
                    .paths(PathSelectors.ant("/yang/**"))
                    .build();
        }
        //配置swagger文档信息apiInfo
        private ApiInfo apiInfo() {
            //作者信息
            Contact contact = new Contact("缘友一世", "https://www.csdn.net/", "xxxx@qq.com");
            return new ApiInfo(
                    "Spring Boot集成Swagger",//标题
                    "学习Swagger",//描述
                    "1.0",//版本
                    "http://localhost",//组织连接
                    contact,//联系人信息
                    "Apache 2.0",//许可
                    "http://www.apache.org/licenses/LICENSE-2.0",//许可连接
                    new ArrayList());//拓展
        }
    }
    
    

    在这里插入图片描述

2.6 配置API分组

  1. 通过groupName()方法即可配置分组

    • 如果没有配置分组,默认是default
    @Bean
    public Docket docket(Environment environment) {
    return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
    	.groupName("hello") // 配置分组
    	// 省略配置....
    }
    
  2. 多个分组,需要配置多个docket

    @Bean
    public Docket docket1() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .groupName("A")
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.yang.controller"))
                //过滤路径
                /*
                    any() // 任何请求都扫描
                    none() // 任何请求都不扫描
                    regex(final String pathRegex) // 通过正则表达式控制
                    ant(final String antPattern) // 通过ant()控制
                 */
                .paths(PathSelectors.ant("/yang/**"))
                .build();
    }
    @Bean
    public Docket docket2() {
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("B");
    }
    @Bean
    public Docket docket3() {
        return new Docket(DocumentationType.SWAGGER_2).groupName("C");
    }
    

    在这里插入图片描述

2.7 配置实体类

  1. 创建实体类

    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    
    /**
     * @author 缘友一世
     * date 2023/1/28-10:21
     */
    
    @ApiModel("用户实体类")
    public class User {
        @ApiModelProperty("用户名")
        public String username;
        @ApiModelProperty("密码")
        public String password;
    }
    
    
    • @ApiModel为类添加注释
    • @ApiModelProperty为类属性添加注释
  2. 请求接口映射到实体类

    • 只要这个实体在请求接口的返回值上(即使是泛型),都能映射到实体项中
    @RequestMapping("/getUser")
    public User getUser(){
    	return new User();
    }
    

    在这里插入图片描述

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

2.8 常用注解

  • 注解所在位置:io.swagger.annotations包下
Swagger注解简单说明
@Api(tags = “模块说明”)作用在模块类上
@ApiOperation(“接口说明”)作用在接口方法上
@ApiModel(“POJO说明”)作用在模型类上:如VO、BO
@ApiModelProperty(value = “属性说明”,hidden = true)作用在类方法和属性上,hidden设置为true可以隐藏该属性
@ApiParam(“参数说明”)作用在参数、方法和字段上,类似@ApiModelProperty

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

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

相关文章

深入开源和金融技术世界,《新程序员005》来了!

亲爱的 CSDN 以及《新程序员》的读者朋友们&#xff0c;《新程序员005&#xff1a;开源深度指南 & 新金融背后的科技力量》正式与大家见面&#xff01;现在&#xff0c;点击下方封面&#xff0c;即可订阅&#xff0c;立享电子书&#xff0c;纸质书将在春节后为大家寄出&…

9、循环语句

目录 一、while循环语句 二、do…while循环语句 三、for循环语句 1. for语句 2. foreach语句 一、while循环语句 while语句也称条件判断语句&#xff0c;它的循环方式为利用一个条件来控制是否要继续反复执行这个语句。 语法如下&#xff1a; 当条件表达式的返回值为真时…

【并发编程十三】c++原子操作(1)

【并发编程十三】c原子操作&#xff08;1&#xff09;一、改动序列1、改动序列2、预测执行二、原子操作及其类别1、原子操作2、非原子操作3、原子类型三、标准原子类型1、标准原子类型的两种实现方式2、原子操作的用途3、原子操作的宏四、操作std:atomic_flag1、简介2、使用说明…

jsp ssm宿舍报修换宿管理系统-宿管idea

目 录 1 1绪论 1 1.1 课题研究的背景 1 1.2 课题研究的意义 1 1.3 本文主要工作 1 2 关键技术介绍 3 2.1 JSP技术的简介 3 2.2 SSM框架 3 2.3 MYSQL数据库 4 2.4 MySQL环境配置 4 2.5 B/S架构 4 3 需求分析与可行性分析 5 3.1功能需求分析…

年后公司缺人,面了13个测试员,发现他们都有一个通病.....

公司缺人&#xff0c;面了不少测试&#xff0c;结果竟然没有一个合适的。 一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在10-20k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。 看简历很多都是3年工作经验&#xff0c;但面试中…

数据不幸丢失怎么办?恢复丢失数据的 7 大方法

有时&#xff0c;您的系统可能会无意中被数据丢失等不可预见的事件唤醒。数据丢失已成为我们数字经济中的普遍现象&#xff0c;其发生的方式多种多样&#xff0c;包括意外删除、病毒攻击、无法访问的分区、数据损坏&#xff0c;甚至更灾难性的情况&#xff0c;如数据盗窃。 不…

Spring进阶:3步引入MybatisPlus多数据源,详细配置及原理解析

前言 MybatisPlus(MP)作为mybatis的增强工具&#xff0c;提供了配置多数据源的扩展&#xff0c;通过简单的几步配置&#xff0c;即可使用注解轻松切换数据源。 以下是dynamic-datasource提供的功能列表&#xff1a; 使用方法 1&#xff0c;引入dynamic-datasource-spring-bo…

第六章 数组、排序和查找

一、数组&#xff08;P156&#xff09; 1. 数组介绍 数组可以存放多个同一类型的数据。数组也是一种数据类型&#xff0c;是引用类型。即&#xff1a;数(数据)组(一组)就是一组数据2. 数组的使用 2.1 使用方式1&#xff1a;动态初始化 数组的定义&#xff1a;数据类型 …

uniCloud 微信小程序登陆全流程demo

ps&#xff1a; 博主一向不喜欢废话&#xff0c;直接说几个点&#xff0c;你悟了就直接去试&#xff0c;可以不用看完&#xff0c;还是得自己去试印象才深刻&#xff0c;博主写博文就怕自己以后忘记做个笔记顺便能帮一个是一个 1、你要获取unionid 肯定得访问外网&#xff0c;u…

【C++初阶】六、STL---string(总)|为什么学习string类|标准库中的string类|string 类常用接口

目录 一、为什么学习string类 1.1 C语言中的字符串 1.2 字符串在OJ面试中 二、标准库中的string类 2.1 string 介绍 2.2 编码格式 三、string 类常用接口 3.1 Member functions&#xff08;成员函数&#xff09; 3.1.1 构造函数&#xff08;Construct&#xff09; 3.…

C++11 并发指南七(C++11 内存模型一:介绍)

C11 并发指南七(C11 内存模型一&#xff1a;介绍) 文章目录C11 并发指南七(C11 内存模型一&#xff1a;介绍)第六章主要介绍了 C11 中的原子类型及其相关的API&#xff0c;原子类型的大多数 API 都需要程序员提供一个 std::memory_order&#xff08;可译为内存序&#xff0c;访…

面试第一次被问到SDK测试,当时就懵了

01、是什么 客户端SDK是为第三方开发者提供的软件开发工具包&#xff0c;包括SDK接口、开发文档和Demo示例等。SDK和应用之间是什么关系呢&#xff1f;以云信即时消息服务为例&#xff0c;如下图所示&#xff0c;应用客户端通过调用云信SDK接口&#xff0c;进行消息等数据查询…

[前端笔记——CSS] 14.图像、媒体和表单元素

[前端笔记——CSS] 14.图像、媒体和表单元素1.CSS调整大小2.图片、媒体和表单元素2.1替换元素2.2 form元素2.3 举个实例1.CSS调整大小 一个空的<div>是没有尺寸的。如果在 HTML 文件中添加一个空<div> 并给予其边框&#xff0c;则会在页面上看到一条线。 <div…

【软件安装】ubuntu安装nvidia驱动,解决闪屏问题

Official Drivers | NVIDIA nvidia驱动下载官网&#xff0c;登陆速度是有点慢的&#xff0c;需要耐心等待 我的电脑是笔记本&#xff0c;ubuntu18.04.6&#xff0c;NVIDIA GeForce RTX 3050 Laptop GPU 天时地利人和的情况下&#xff0c;按照下面这篇博文就可以顺利安装nvidi…

【存储】etcd的存储是如何实现的(2)

在上一篇中&#xff0c;介绍了etcd底层存储的内容&#xff0c;包括wal、raft.MemoryStorage以及backend。在介绍backend时提到了backend只是etcd kv存储的一部分&#xff0c;负责持久化存储&#xff0c;backend加内存化treeIndex才构成etcd完整的支持mvcc的kv存储。所以这篇就来…

红队大量资产指纹探测工具和摄像头漏-洞渗-透和利用工具

红队大量资产指纹探测工具和摄像头漏-洞渗-透和利用工具。 Finger定位于一款红队在大量的资产中存活探测与重点攻-击系统指纹探测工具。在面临大量资产时候Finger可以快速从中查找出重点攻-击系统协助我们快速展开渗-透。 实际效果 URL批量扫描效果如下: 调用api进行资产收集效…

第九层(6):STL之queue

文章目录前情回顾queue概念queue容器需要注意的地方queue类内的构造函数queue类内的赋值操作queue类内的插入操作queue类内的删除操作queue类内的访问queue类内的大小操作下一座石碑&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;一名大一的智能制造专业学生&…

设计模式第4式:观察者模式Spring事件监听机制

前言 观察者模式是一种非常重要的设计模式&#xff0c;在JDK和Spring源码中使用非常广泛&#xff0c;而且消息队列软件如kafka、rocketmq等也应用了观察者模式。那么我们就很有必要学习一下观察者模式了。 随后我们来看看大名鼎鼎的事件监听机制&#xff0c;它是基于观察者模…

直波导与微环的耦合——Lumerical仿真1

微环与直波导的耦合的Lumerical仿真的一个记录&#xff0c;包括仿真步骤和一些问题的探究&#xff0c;参考自https://www.bilibili.com/video/BV1tF411z714。 &#x1f381;附Lumerical仿真文件 Lumerical第一个仿真一、建立结构1、放置微环结构2、修改结构二、光源1、放置光源…

React是不是MVVM架构?

首先说结论&#xff1a;不是 一、MVVM Model-View-ViewModel&#xff1a;一句话概括MVVM&#xff0c;操作数据&#xff0c;就是操作视图&#xff0c;就是操作DOM。开发者只需要完成包含申明绑定的视图模板&#xff0c;编写ViewModel中业务数据变更逻辑&#xff0c;View层则完…