SpringBoot 学习(七)Swagger

news2024/12/26 11:12:49

7. Swagger

7.1 简介

  • 便于前后端集成联调
  • RestFul Api 文档在线生成工具 ==> Api 文档与 Api 定义同步更新
  • 直接运行,在线测试 Api 接口

7.2 springboot 集成 swagger

(1) 导入依赖

<!-- 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>

(2) 集成 swagger

@Configuration
@EnableSwagger2 // 开启 swagger2
public class SwaggerConfig {
}

(3) swagger 页面信息

接口:localhost://8080/swagger-ui.html

在这里插入图片描述

(4) 配置 swagger 信息

@Configuration
@EnableSwagger2 // 开启 swagger2
public class SwaggerConfig {

    // 配置 Swagger Docket 的 bean 实例
    @Bean
    public Docket docket() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());
    }

    // 配置 swagger api 信息
    private ApiInfo apiInfo() {
        // 作者信息
        Contact contact = new Contact("why", "https://gitee.com/", "1942953841@qq.com");
        return new ApiInfo("Why Swagger Api Info",
                            "Why so serious!!!",
                            "v1.0",
                            "https://gitee.com/",
                            contact,
                            "Apache 2.0",
                            "http://www.apache.org/licenses/LICENSE-2.0",
                            new ArrayList()
        );
    }
}

(5) 配置 swagger 自定义扫描接口

// 多环境配置,注解方法
@PropertySource(value = "classpath:application.properties")
@Configuration
@EnableSwagger2 // 开启 swagger2
public class SwaggerConfig {

    // 配置 Swagger Docket 的 bean 实例
    @Bean
    public Docket docket(Environment environment) {
        // 多环境配置,java 方法
        // 设置要显示的 swagger 环境
        // Profiles profiles = Profiles.of("dev", "test");
        // 判断是否处在自己设定的环境中
        // boolean flag = environment.acceptsProfiles(profiles);

        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                // enable 是否启用 swagger
                // .enable(flag)
                .select()
                // RequestHandlerSelectors 配置扫描接口的方式
                // basePackage 指定要扫描的包
                // any() 扫描全部
                // none() 不扫描
                // withClassAnnotation 扫描类上的注解,参数是一个类上的反射对象
                // withMethodAnnotation 扫描方法上的注解
                .apis(RequestHandlerSelectors.basePackage("com.why.swagger.controller"))
                // paths 路径过滤
                // .paths(PathSelectors.ant("/why/**"))
                .build();
    }
}

(6) 多文档分组配置

@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("C");
}

(7) 注解的使用

  • 实体类

    /**
     * @ApiModel 用在类上,表示对类进行说明,用于实体类中的参数接收说明。
     */
    @ApiModel(value = "com.why.pojo.User", description = "用户类")
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
    
        /**
         * @ApiModelProperty() 用于字段,表示对 model 属性的说明。
         */
        @ApiModelProperty("用户名")
        private String username;
    
        @ApiModelProperty("密码")
        private String password;
    }
    
  • 接口

    /**
     * @Api 用在类上,说明该类的作用。
     * tags:接口说明,可以在页面中显示。
     */
    @Api(tags = "Hello 控制器类")
    @RestController
    public class HelloController {
    
        @ApiOperation("hello 方法")
        @GetMapping("/hello")
        public String hello() {
            return "hello";
        }
    
        /**
         * @ApiOperation 用在 Controller 里的方法上,说明方法的作用,每一个接口的定义。
         * value:接口名称
         * notes:详细说明
         */
        @ApiOperation(value = "user 控制器", notes = "获取用户")
    
        /**
         * @ApiImplicitParams / @ApiImplicitParam 为单独的请求参数进行说明
         * name:参数名,对应方法中单独的参数名称。
         * value:参数中文说明。
         * required:是否必填。
         * paramType:参数类型,取值为 path、query、body、header、form。
         * dataType:参数数据类型。
         * defaultValue:默认值。
         */
        @ApiImplicitParams({
                @ApiImplicitParam(name = "username", value = "用户名", dataType = "string", paramType = "query", required = true, defaultValue = "why"),
                @ApiImplicitParam(name = "password", value = "密码", dataType = "string", paramType = "query", required = true, defaultValue = "123")
        })
    
        /**
         * @ApiResponse 用于方法上,说明接口响应的一些信息;@ApiResponses 组装了多个 @ApiResponse。
         */
        @ApiResponses({ @ApiResponse(code = 200, message = "OK", response = User.class) })
        
        @PostMapping(value = "/userObj")
        
        /**
         * @ApiParam 用于 Controller 中方法的参数说明。
         * value:参数说明
         * required:是否必填
         */
        public User userObj(@ApiParam(value = "用户名", required = true) String username,
                            @ApiParam(value = "密码", required = true) String password) {
            User user = new User(username, password);
            System.out.println(user);
            return user;
        }
    
    }
    

(8) 接口测试

  • swagger2 测试 get 接口不能传递参数,测试 post 接口可以传递参数

    即含参接口使用 @PostMapping 和 @RequestMapping

  • swagger2 测试含参 @GetMapping 会报如下错误:

    TypeError: Failed to execute ‘fetch‘ on ‘Window‘: Request with GET/HEAD method cannot have body.

  • 效果

    在这里插入图片描述

    • Get 方法

      在这里插入图片描述

      在这里插入图片描述

      在这里插入图片描述

    • Post

      在这里插入图片描述

      在这里插入图片描述

(9) 安全考虑

  • 正式发布一定要关闭 swagger,

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

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

相关文章

清华用7个ChatGPT模拟《狼人杀》,结果出乎意料!

为了验证大语言模型的沟通、规划、反思等拟人化能力&#xff0c;清华研究团队发布了一篇名为“探索大语言模型在交流游戏中的应用&#xff1a;《狼人杀》实验”的研究论文。 结果显示&#xff0c;通过ChatGPT&#xff08;GPT -turbo-0301&#xff09;构建的7个玩家&#xff0c…

【高云FPGA系列教程(11):MultiButton按键驱动模块移植】

文章目录 1. MultiButton简介2. MultiButton代码获取3. MultiButton移植4. 测试与运行本文是高云FPGA系列教程的第11篇文章。 1. MultiButton简介 MultiButton, 一个小巧简单易用的事件驱动型按键驱动模块,可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构…

nssm部署jar包

nssm部署jar包 1、软件下载 官方传送门 csdn下载地址 2、安装服务 F: cd F:\服务启动目录 set JAVA_HOMEF:\Program Files\Java\jdk1.8.0_181 set CLASSPATH.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOMe%\lib\tools.jar; set Path%JAVA_HOME%\bin; java -Dfile.encodingutf-8 -…

解决Vue设置图片的动态src不生效的问题

一、问题描述 在vue项目中&#xff0c;想要动态设置img的src时&#xff0c;此时发现图片会加载失败。在Vue代码中是这样写的&#xff1a; 在Vue的data中是这样写的&#xff1a; 我的图片在根目录下的static里面&#xff1a; 但是在页面上这个图片却无法加载出来。 二、解决方案…

使用原生html<table>构造复杂table表

<table border data-sort"sortDisabled" align"center" class"table"><tbody><tr class"textarea1"><td rowspan"1" colspan"2" class"background-gray"><label>日期<…

更新andriod studio版本,项目编译报could not find org.junit.jupiter:junit-jupiter

原本使用Android Studio 版本是4.1.1&#xff0c;现更新为 点击build -》 build bundle -》build apk&#xff0c;项目报 Could not determine the dependencies of task :app:compileDebugUnitTestJavaWithJavac. > Could not resolve all task dependencies for configur…

前脚收费,后脚道歉?Unity收费新规引众怒,Epic承诺虚幻引擎永久免费

&#xfeff;当你还在纠结开发游戏用Unity引擎还是UE虚幻引擎的时候&#xff0c;Unity已经给游戏开发领域重重一拳。 &#xfeff;Unity作为一款全球范围内广泛使用的游戏引擎&#xff0c;因其价格亲民且灵活而备受众多开发者的青睐。然而在9月12日&#xff0c;Unity突然宣布计…

分析大疆官网根据ip自动跳转到指定域名

如果cookie存在region且有效&#xff0c;跳转到指定域名&#xff0c; 如果cookie存在region且无效&#xff0c;跳转到默认域名&#xff0c; 如果禁用cookie或者cookie中没有region&#xff0c;根据ip自动判断所在地区&#xff0c;跳转到指定域名 1、浏览器地址栏输入dji.com&am…

2018-2022年盟浪 ESG数据

2018-2022年盟浪 ESG数据 1、时间&#xff1a;2018-2022年 2、指标&#xff1a;证券代码、证券简称、盟浪ESG评级、省份、城市、所属证监会行业名称[交易日期] 最新收盘日[行业级别] 大类行业、所属证监会行业代码[交易日期] 最新收盘日[行业级别] 大类行业 3、范围&#xf…

图像练习-计算平行线距离opencv(03)

原图 //对输入图像进行细化 cv::Mat ThinLine(const cv::Mat& matsrc, const int& iterations) {//CvSize size cvGetSize(src);cv::Mat dst matsrc.clone();//拷贝一个数组给另一个数组int _iwidth dst.cols;int _iheight dst.rows;int n 0, i 0, j 0;for (n …

【每日一题】658. 找到 K 个最接近的元素

658. 找到 K 个最接近的元素 - 力扣&#xff08;LeetCode&#xff09; 给定一个 排序好 的数组 arr &#xff0c;两个整数 k 和 x &#xff0c;从数组中找到最靠近 x&#xff08;两数之差最小&#xff09;的 k 个数。返回的结果必须要是按升序排好的。 整数 a 比整数 b 更接近 …

抖音SEO矩阵系统源码开发搭建

1. 确定需求和功能&#xff1a;明确系统的主要目标和需要实现的功能&#xff0c;包括关键词研究、短视频制作、外链建设、数据分析、账号设置优化等方面。 2. 设计系统架构&#xff1a;根据需求和功能确定系统的架构&#xff0c;包括前端、后端、数据库等部分的设计&#xff0…

计算机组成原理之硬件的内部结构,拆开单独的硬件,查看硬件组成部分的结构和功能。

大家好&#xff0c;欢迎阅读《计算机组成原理》的系列文章&#xff0c;本系列文章主要教内容是从零学习计算机组成原理&#xff0c;内容通俗易懂&#xff0c;大家好好学习吧&#xff01;&#xff01;&#xff01; 更多的优质内容&#xff0c;请点击以下链接查看哦~~ ↓ ↓ ↓ …

【加载数据--自定义自己的Dataset类】

【加载数据自定义自己的Dataset类】 1 加载数据2 数据转换3 自定义Dataset类4 划分训练集和测试集5 提取一批次数据并绘制样例图 假设有四种天气图片数据全部存放与一个文件夹中&#xff0c;如下图所示&#xff1a; ├─dataset2 │ cloudy1.jpg │ cloudy10.jpg │ …

使用matlab产生二维动态曲线视频文件具体举例

使用matlab产生二维动态曲线视频文件举例 在进行有些函数变化过程时候&#xff0c;需要用到直观的动态显示&#xff0c;本博文将举例说明利用Matlab编程进行二维动态曲线的生成视频文件。 一、问题描述 利用matlab编程实现 y 1 s i n ( t ) , y 2 c o s ( t ) , y 3 s i …

JAVA_多线程的实现方式

线程的状态 方式一&#xff1a; public class Thread1 extends Thread {Overridepublic void run() {synchronized (this) {for (int i 0; i < 100; i) {System.out.println(getName() "" i);}}} } Thread1 thread1 new Thread1(); thread1.start(); 方式二…

用flex实现grid布局

1. css代码 .flexColumn(columns, gutterSize) {display: flex;flex-flow: row wrap;margin: calc(gutterSize / -2);> div {flex: 0 0 calc(100% / columns);padding: calc(gutterSize / 2);box-sizing: border-box;} }2.用法 .grid-show-item3 {width: 100%;display: fl…

天洑软件祝贺“星耀蓉城 篮能可贵”四城邀请赛暨西北工业大学校友篮球嘉年华活动圆满举办

9月16日&#xff0c;由西北工业大学成都校友会主办&#xff0c;成都市新都区文化体育和旅游局承办&#xff0c;天洑软件、泸州老窖、陕西省篮球协会、龙湖地产、奥伦达科技、南京全信、成都鑫长源、四川银行、优仿科技、华科机电、小鱼易连、四川省篮球协会、GAME7篮球俱乐部赞…

云安全之访问控制介绍

访问控制技术背景 信息系统自身的复杂性、网络的广泛可接入性等因素&#xff0c;系统面临日益增多的安全威胁&#xff0c;安全问题日益突出&#xff0c;其中一个重要的问题是如何有效地保护系统的资源不被窃取和破坏。 访问控制技术内容包括访问控制策略、访问控制模型、访问…

virtualbox无界面打开linux虚拟机的bat脚本,以及idea(代替Xshell)连接linux虚拟机的方法

virtualbox无界面打开linux虚拟机的bat脚本&#xff0c;以及idea连接linux虚拟机的方法 命令行运行代码成功运行的效果图 idea连接linux虚拟机的方法【重要】查看虚拟机的IP地址idea中选择菜单&#xff08;该功能可代替Xshell软件&#xff09;配置设置连接成功进入idea中的命令…