swagger3的配置和使用(一)

2023-11-02

Swagger3简介

swagger官网:传送门
swagger是一个Api框架,就是一个工具,就比如我们可以使用postman测试接口一样,swagger主要作用是生成RESTFUL接口的文档并且可以提供功能测试;
通过swagger可以获取项目的api结果,生成清晰的api文档,并可以进行一些自动化测试

Swagger的组成

  1. Swagger-tools:提供各种与Swagger进行集成和交互的工具。例如模式检验、Swagger 1.2文档转换成Swagger2.0文档等功能。
  2. Swagger-core:用于Java/Scala的的Swagger实现。与JAX-RS(Jersey、Resteasy、CXF…)、Servlets和Play框架进行集成。
  3. Swagger-js: 用于JavaScript的Swagger实现。
  4. Swagger-node-express: Swagger模块,用于node.js的Express web应用框架。
  5. Swagger-ui:一个无依赖的HTML、JS和CSS集合,可以为Swagger兼容API动态生成优雅文档。
  6. Swagger-codegen:一个模板驱动引擎,通过分析用户Swagger资源声明以各种语言生成客户端代码。

Swagger的Springboot配置

maven添加依赖

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

创建swagger的配置类

import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI;
import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
 
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
 
/**
 * @author rongrong
 * @version 1.0
 * @description Swagger3配置
 * @date 2021/01/12 21:00
 */
@Configuration
@Profile({"dev", "local"})
@EnableOpenApi
@EnableSwaggerBootstrapUI
public class SwaggerConfig {
 
    /**
     * 是否开启swagger配置,生产环境需关闭
     */
    /*    @Value("${swagger.enabled}")*/
    private boolean enable;
 
    /**
     * 创建API
     * http:IP:端口号/swagger-ui/index.html 原生地址
     * http:IP:端口号/doc.html bootStrap-UI地址
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.OAS_30).pathMapping("/")
                // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
                /*.enable(enable)*/
                .apiInfo(apiInfo())
                // 设置哪些接口暴露给Swagger展示
                .select()
                // 扫描所有有注解的api,用这种方式更灵活
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                // 扫描指定包中的swagger注解
                // .apis(RequestHandlerSelectors.basePackage("com.doctorcloud.product.web.controller"))
                // 扫描所有 .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.regex("(?!/ApiError.*).*"))
                .paths(PathSelectors.any())
                .build()
                // 支持的通讯协议集合
                .protocols(newHashSet("https", "http"))
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts());
 
    }
 
    /**
     * 支持的通讯协议集合
     *
     * @param type1
     * @param type2
     * @return
     */
    private Set<String> newHashSet(String type1, String type2) {
        Set<String> set = new HashSet<>();
        set.add(type1);
        set.add(type2);
        return set;
    }
 
    /**
     * 认证的安全上下文
     */
    private List<SecurityScheme> securitySchemes() {
        List<SecurityScheme> securitySchemes = new ArrayList<>();
        securitySchemes.add(new ApiKey("token", "token", "header"));
        return securitySchemes;
    }
 
    /**
     * 授权信息全局应用
     */
    private List<SecurityContext> securityContexts() {
        List<SecurityContext> securityContexts = new ArrayList<>();
        securityContexts.add(SecurityContext.builder()
                .securityReferences(defaultAuth())
                .forPaths(PathSelectors.any()).build());
        return securityContexts;
    }
 
     /**
     * 默认的安全上引用
     */
    private List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        List<SecurityReference> securityReferences = new ArrayList<>();
        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
        return securityReferences;
    }
 
 
    /**
     * 添加摘要信息
     * @return 返回ApiInfo对象
     */
    private ApiInfo apiInfo() {
        // 用ApiInfoBuilder进行定制
        return new ApiInfoBuilder()
                // 设置标题
                .title("接口文档")
                // 服务条款
                .termsOfServiceUrl("NO terms of service")
                // 描述
                .description("这是SWAGGER_3生成的接口文档")
                // 作者信息
                .contact(new Contact("rongrong", "https://www.cnblogs.com/longronglang/", "rongrong@gmail.com"))
                // 版本
                .version("版本号:V1.0")
                //协议
                .license("The Apache License")
                // 协议url
                .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html")
                .build();
    }
}

说明:
swagger3 摒弃了@EnableSwagger2这个注解,改成了@EnableOpenApi
swagger3 使用DocumentationType.OAS_30,swagger2版本这里是DocumentationType.SWAGGER_2

访问路径

http:IP:端口号/swagger-ui/index.html
在这里插入图片描述

application.yml环境配置

添加如下内容,使得只在测试环境中才会有swagger,正式环境不显示

spring:
  profiles:
    active: dev

API分组

Swagger默认是一个default分组:
在这里插入图片描述
可以通过分组来实现对不同API的分类,分组可以使用Docket的groupName属性区分不同分组,并可以在Swagger中创建多个Docket的Bean实例来定义不同分组;

@Bean
public Docket docketCategory() {
    return new Docket(DocumentationType.OAS_30)
            .apiInfo(apiInfo())
            // 分组名称
            .groupName("Category")
            .enable(true)
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.yang.takeout.backend.controller"))
            // 过滤请求,只扫描请求以/category开头的接口
            .paths(PathSelectors.ant("/category/**"))
            .build();
}

@Bean
public Docket docketEmployee() {
    return new Docket(DocumentationType.OAS_30)
            .apiInfo(apiInfo())
            // 分组名称
            .groupName("Employee")
            .enable(true)
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.yang.takeout.backend.controller"))
            // 过滤请求,只扫描请求以/employee开头的接口
            .paths(PathSelectors.ant("/employee/**"))
            .build();
}

这里我只配置了两个分组,可以多创建几个Docket实例实现多分组;

分组效果:
在这里插入图片描述

Swagger常用注解

注解说明

用于类上

@Api:用在请求的类上,表示对类的说明
tags=“说明该类的作用,可以在UI界面上看到的注解”
value=“该参数没什么意义,在UI界面上也看到,所以不需要配置”

用于方法上

@ApiOperation:用在请求的方法上,说明方法的用途、作用
value=“说明方法的用途、作用”
notes=“方法的备注说明”
在这里插入图片描述

@ApiImplicitParams:用在请求的方法上,表示一组参数说明
@ApiImplicitParam:用在@ApiImplicitParams注解中,指定一个请求参数的各个方面
name:参数名
value:参数的汉字说明、解释
required:参数是否必须传
paramType:参数放在哪个地方
· header --> 请求参数的获取:@RequestHeader
· query --> 请求参数的获取:@RequestParam
· path(用于restful接口)–> 请求参数的获取:@PathVariable
· div(不常用)
· form(不常用)
dataType:参数类型,默认String,其它值dataType=“Integer”
defaultValue:参数的默认值

@Api(tags="用户模块")
@Controller
public class UserController {

	@ApiOperation(value="用户登录",notes="随边说点啥")
	@ApiImplicitParams({
		@ApiImplicitParam(name="mobile",value="手机号",required=true,paramType="form"),
		@ApiImplicitParam(name="password",value="密码",required=true,paramType="form"),
		@ApiImplicitParam(name="age",value="年龄",required=true,paramType="form",dataType="Integer")
	})
	@PostMapping("/login")
	public JsonResult login(@RequestParam String mobile, @RequestParam String password,
	@RequestParam Integer age){
		//...
	    return JsonResult.ok(map);
	}
}

@ApiResponses:用在请求的方法上,表示一组响应
@ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息
code:数字,例如400
message:信息,例如"请求参数没填好"
response:抛出异常的类

@Api(tags="用户模块")
@Controller
public class UserController {

	@ApiOperation("获取用户信息")
	@ApiImplicitParams({
		@ApiImplicitParam(paramType="query", name="userId", dataType="String", required=true, value="用户Id")
	}) 
	@ApiResponses({
		@ApiResponse(code = 200, message = "请求成功"),
		@ApiResponse(code = 400, message = "请求参数没填好"),
		@ApiResponse(code = 404, message = "请求路径没有或页面跳转路径不对")
	}) 
	@ResponseBody
	@RequestMapping("/list")
	public JsonResult list(@RequestParam String userId) {
		...
		return JsonResult.ok().put("page", pageUtil);
	}
}

用于对象类

@ApiModel:用于响应类上,表示一个返回响应数据的信息
(这种一般用在post创建的时候,使用@RequestBody这样的场景,
请求参数无法使用@ApiImplicitParam注解进行描述的时候)
@ApiModelProperty:用在属性上,描述响应类的属性
value–字段说明
name–重写属性名字
dataType–重写属性类型
required–是否必填
example–举例说明
hidden–隐藏

@ApiModel的功能:
1、当请求数据描述,即 @RequestBody 时, 用于封装请求(包括数据的各种校验)数据;
2、当响应值是对象时,即 @ResponseBody 时,用于返回值对象的描述。
当请求数据描述时, @RequestBody 时的使用

@ApiModel(description = "用户登录")
public class UserLoginVO implements Serializable {

	private static final long serialVersionUID = 1L;

	@ApiModelProperty(value = "用户名",required=true)	
	private String username;

	@ApiModelProperty(value = "密码",required=true)	
	private String password;
	
	// getter/setter省略
}
@Api(tags="用户模块")
@Controller
public class UserController {

	@ApiOperation(value = "用户登录", notes = "")	
	@PostMapping(value = "/login")
	public R login(@RequestBody UserLoginVO userLoginVO) {
		User user=userSerivce.login(userLoginVO);
		return R.okData(user);
	}
}

借鉴:
【1】SpringBoot从0到实战8:简单使用Swagger生成接口开发文档
【2】 Swagger3 常用配置注解讲解 结合SpringBoot2
【3】Swagger笔记—Swagger3详细配置
【4】Swagger3的基本使用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

swagger3的配置和使用(一) 的相关文章

  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • 如何通过 javaconfig 使用 SchedulerFactoryBean.schedulerContextAsMap

    我使用 Spring 4 0 并将项目从 xml 移至 java config 除了访问 Service scheduleService 带注释的类来自QuartzJobBean executeInternal 我必须让它工作的 xml 位
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static

随机推荐

  • Qt--tableWidget相关操作

    一 从tableWidget取出某一行内容 1 获取当前选中的行数 所用函数 QModelIndex currentIndex const int currentRow ui gt tableWidget gt currentIndex r
  • SpringBoot banner佛祖

    spingboot学习小彩蛋 当我们开启我们第一个springboot程序的时候 控制台会打印出来一个Spring字符 但是这个Spring是可以修改的 例如修改成一个字符组成的图片 网上有很多类似的代码 只需要复制之后在resources
  • LTP4.0 docker 安装使用说明;ltp工具包使用说明

    ltp4 0 6月份放出来了 一个模型进行多任务学习 立马测试了一下效果 确实不错 github链接 https github com HIT SCIR ltp 1 首先下载docker 使用pytorch1 4版本 python版本3 7
  • riscv-xv6单步调试5 锁与多核调度

    0 序 本次主要记录xv6锁的实现和在多核调度中的应用 同步与互斥 1 spinlock的实现 位于 spinlock h struct spinlock uint locked Is the lock held 0表示没被获取 1表示被某
  • 从一路高歌到遭多国“封杀”,ChatGPT未来将是什么样子?

    IT有得聊 是机械工业出版社旗下IT专业资讯和服务平台 致力于帮助读者在广义的IT领域里 掌握更专业 更实用的知识与技能 快速提升职场竞争力 点击蓝色微信名可快速关注我们 人工智能技术的发展已经逐渐改变了我们的生活和工作方式 其中 语言模型
  • 每日一题:子串的最大差

    子串的最大差 题目 Daimayuan Online Judge 枚举每个子串不现实 肯定会超时 子串1的最大值 子串1的最小值 子串2的最大值 子串2的最小值 即为 子串1的最大值 子串2的最大值 子串1的最小值 子串2的最小值 可以从贡
  • Linux环境下Selenium截图乱码及字体安装及与字符集区别

    概述 参考Java实现HTML页面截图功能 在使用Selenium对HTML页面进行截图时 一段没有任何问题的代码 在Windows环境下执行成功 但放到使用很久的测试环境Linux服务器也没有问题 但是部署到刚申请不久的阿里云生产Linu
  • yolov7 mask 使用学习笔记

    目录 yolov7 mask trt安装笔记 安装detectron方法1 OK 安装detectron方法2 pip install regex 4 1 无法找到头文件 math h fatal error C1083 安装cocoapi
  • React 16入门教程

    React 16入门教程 技术胖 讲的一般 React16 8版本 https jspang com posts 2019 05 04 new react base html E7 AC AC01 E8 8A 82 EF BC 9Areac
  • dinky报错:Communications link failure The last packet sent successfully to the server was 0 millisecon

    dinky链接MySQL报错 说明 MySQL版本是5 x版本 driver版本是 8 x版本 com mysql cj jdbc exceptions CommunicationsException Communications link
  • java对象序列化流设置类中的某个成员变量不参与序列化和反序列化操作

    我们用对象反序列化流输出类的name变量 然后我们给这个name变量定义一个transient关键字修饰 private transient String name 然后我们再次用反序列化读取 此时我们就不再能拿到name的值了 因为他已经
  • 项目部署到tomcat里css,js等文件失效

    项目在IDEA里面跑的好好的 到了tomcat里面样式就失效了 如何处理 其实这是我们开发中忽略了一个细节导致的 就是如果您的JavaWeb的模板使用的是thymeleaf模板的话 那么您在引入css或者js等文件的时候 一定要用下面的格式
  • h3c虚拟服务器无效,请教:H3C模拟器中防火墙无法PING通PC(虚拟主机) - H3C技术论坛 - 51CTO技术论坛_中国领先的IT技术社区...

    H3C网络模拟器版本 HCL 2 0 2 1 防火墙F1060 使用虚拟主机 PC 连接防火墙G1 0 1端口 防火墙G1 0 1端口IP地址 192 168 0 1 24 PC机端口IP地址 192 168 0 2 24 配置命令 sec
  • ros的入门知识

    ros的入门教程链接 linux ros安装 学前小案例 键盘控制小海龟的移动 创建工作空间与功能包 发布者publisher 订阅者subscriber ros的基础知识点 不同的linux系统安装的ros版本是不一样的 linux18
  • nmake简介

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 nmake学习初步 前言 一 nmake在哪里 二 Makefile编写 1 hello c实例代码 2 Makefile 3 扩展 前言 一直使用vs的IDE 最近编译sq
  • tomcat守护进程

    如何写一个linux系统下的tomcat守护进程呢 上菜 1 编写守护进程shell脚本 下面这个脚本可以直接拿过来用 只需要改URL 和 tomcat启动目录即可 bin bash echo Start URL http 127 0 0
  • 六、线性队列

    序言 结构图 队列结构 队列常用操作 队列的实现 序言 线性队列是用数组实现的队列 队列遵循的原则FIFO first in first out 通常我们说的线性队列 为了节省数组的空间使用 都是循环队列 结构图 队列结构 typedef
  • 【函数(上)(双重for循环)】

    1 循环 1 双重for循环 概述 循环嵌套是指在一个循环语句中再定义一个循环语法结构 例如 嵌套一个for循环 这样for循环语句我们称之为双重for循环 双重for循环语法 for 外循环的初始 外循环的条件 外循环的表达式 for 内
  • LoadOfTheRoot提权学习

    端口碰撞 端口试探 port knocking 是一种通过连接尝试 从外部打开原先关闭端口的方法 一旦收到正确顺序的连接尝试 防火墙就会动态打开一些特定的端口给允许尝试连接的主机 端口试探的主要目的是防治攻击者通过端口扫描的方式对主机进行攻
  • swagger3的配置和使用(一)

    目录 Swagger3简介 Swagger的组成 Swagger的Springboot配置 maven添加依赖 创建swagger的配置类 访问路径 application yml环境配置 API分组 Swagger常用注解 注解说明 用于