Spring Boot 集成 swagger 3.0 指南

news2024/9/22 13:38:49

Spring Boot 集成 swagger 3.0 指南

    • 一、Swagger介绍
      • 1.springfox-swagger 2
      • 2.SpringFox 3.0.0 发布
    • 二、Spring Boot 集成 swagger 3.0
      • 1. 添加Maven依赖
      • 2. 创建配置类配置Swagger
        • 2.1 创建SwaggerConfig 配置类
        • 2.1 创建TestInfoConfig信息配置类
      • 3. 在你的Controller上添加swagger注解
      • 4. 如启用了访问权限,还需将swagger相关uri允许匿名访问
      • 5. 启动与访问

一、Swagger介绍

  • 号称世界上最流行的Api框架;
  • Restful Api 文档在线自动生成工具=>Api文档与API定义同步更新
  • 直接运行,可以在在线测试API 接口
  • 支持多种语言:(java,Php…)

官网地址:https://swagger.io/

1.springfox-swagger 2

SpringBoot项目整合Swagger2需要用到两个依赖:springfox-swagger2和springfox-swagger-ui,用于自动生成swagger文档。

  • springfox-swagger2:这个组件的功能用于帮助我们自动生成描述API的json文件。
  • springfox-swagger-ui:就是将描述API的json文件解析出来,用一种更友好的方式呈现出来。

2.SpringFox 3.0.0 发布

此版本的亮点:

  • Spring5,Webflux支持(仅支持请求映射,尚不支持功能端点)。
  • Spring Integration支持。
  • SpringBoot支持springfox Boot starter依赖性(零配置、自动配置支持)。
  • 支持OpenApi 3.0.3。
  • 零依赖。几乎只需要spring-plugin,swagger-core ,现有的swagger2注释将继续工作并丰富openapi3.0规范。

兼容性说明:

  • 需要Java 8
  • 需要Spring5.x(未在早期版本中测试)
  • 需要SpringBoot 2.2+(未在早期版本中测试)

注意:Swagger2.0Swagger3.0有很多区别,下面使用的是Swagger3.0,有区别的地方会简单说明。

二、Spring Boot 集成 swagger 3.0

1. 添加Maven依赖

引入依赖springfox-boot-starter:

<!-- 引入Swagger3依赖 -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

2. 创建配置类配置Swagger

自定义配置信息:
3.0版本在配置上与2.9稍有差别,包括依赖包改为: springfox-boot-starter,启用注解更改为: @EnableOpenApi等。

  • Swagger3.0 注解:@EnableOpenApi
  • Swagger2.0 注解:@EnableSwagger2
2.1 创建SwaggerConfig 配置类
package com.test.web.core.config;

import java.util.ArrayList;
import java.util.List;

import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.test.common.config.TestInfoConfig;
import io.swagger.annotations.ApiOperation;
import io.swagger.models.auth.In;
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.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.Contact;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.service.SecurityScheme;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;

/**
 * Swagger3的接口配置
 *
 * @author fy
 */
@Configuration
//默认开启 可注释
//@EnableOpenApi
public class SwaggerConfig {

    /**
     * 系统基础配置  yml文件可配置读取
     */
    @Autowired
    private TestInfoConfig testInfoConfig;

    /**
     * 是否开启swagger
     */
    @Value("${swagger.enabled}")
    private boolean enabled;

    /**
     * 设置请求的统一前缀
     */
    @Value("${swagger.pathMapping}")
    private String pathMapping;

    /**
     * 创建API
     */
    @Bean
    public Docket createRestApi() {

        return new Docket(DocumentationType.OAS_30)
                 // 使用 swagger 开关。默认 true
                .enable(enabled)
                // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
                .apiInfo(apiInfo())
                // 设置哪些接口暴露给Swagger展示
                .select()
                // 扫描所有有注解的api,用这种方式更灵活
                // 以 @ApiOperation 注解为依据进行扫描
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                // 以 @Api 注解为依据进行扫描
                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
                // 扫描指定包中的swagger注解
                //.apis(RequestHandlerSelectors.basePackage("com.test.web"))
                // 扫描所有
                // .apis(RequestHandlerSelectors.any())

                //过滤器:对外暴露所有 URI
                .paths(PathSelectors.any())
                //.paths(none())  // 过滤器:一个 URI 都不对外暴露
                //.paths(ant())   // 过滤器:对外暴露符合 ANT 风格正则表达式的 URI
                //.paths(regex()  // 过滤器:对外暴露符合正则表达式的 URI

                .build()
                //设置安全模式,swagger可以设置访问token
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts());
//                .pathMapping(pathMapping)
    }

    /**
     * 安全模式,这里指定token通过Authorization头请求头传递
     */
    private List<SecurityScheme> securitySchemes() {
        List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
        apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue()));
        return apiKeyList;
    }

    /**
     * 安全上下文
     */
    private List<SecurityContext> securityContexts() {
        List<SecurityContext> securityContexts = new ArrayList<>();
        securityContexts.add(
                SecurityContext.builder()
                        .securityReferences(defaultAuth())
                        .operationSelector(o -> o.requestMappingPattern().matches("/.*"))
                        .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;
    }

    /**
     * 添加摘要信息
     */
    private ApiInfo apiInfo() {
        // 用ApiInfoBuilder进行定制
        return new ApiInfoBuilder()
                // 设置标题
                .title("Test API文档")
                // 描述
                .description("某物联网平台接口文档说明")
                // 作者信息
                .contact(new Contact(testInfoConfig.getName(), "http://aaaa.com", "ahsjda@163.com"))
                // 版本
                .version(testInfoConfig.getVersion())
                .build();
    }
}

2.1 创建TestInfoConfig信息配置类
package com.test.common.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 读取项目相关配置
 *
 * @author fy
 */
@Component
@ConfigurationProperties(prefix = "test")
@Data
public class TestInfoConfig{
    /**
     * 项目名称
     */
    private String name;

    /**
     * 版本
     */
    private String version;

    /**
     * 版权年份
     */
    private String copyrightYear;
}

TestInfoConfig Yml配置信息如下图所示:
在这里插入图片描述

3. 在你的Controller上添加swagger注解

在这里插入图片描述

4. 如启用了访问权限,还需将swagger相关uri允许匿名访问

具体需要添加的uri有:

/swagger**/**
/webjars/**
/v3/**
/doc.html

5. 启动与访问

启动应用,访问地址http://localhost:8080/swagger-ui/index.html

Swagger2.0 、Swagger3.0访问地址区别:

  • Swagger3.0 访问地址:http://localhost:8080/swagger-ui/index.html
  • Swagger2.0 访问地址:http://localhost:8080/swagger-ui.html

在这里插入图片描述

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

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

相关文章

【深度学习与NLP】——最全环境配置总指南

目录 一、Anaconda 的环境准备 1.下载和安装 1.1. 下载 1.1.1. 官网下载 1.1.2. 镜像站下载&#xff08;官网下载速度慢可选&#xff09; 1.2. 安装 2. 环境配置 2.1 Windows 平台 2.2 MacOS 和 Linux 平台 3. 环境验证 3.1 Windows 平台 3.2 MacOS 和 Linux 平台 …

34集-35集 【完整版小白上手环境搭建】玩转ESP-ADF实现AIGC大模型对话功能-1-《MCU嵌入式AI开发笔记》

34集-35集 【完整版小白上手环境搭建】玩转ESP-ADF实现AIGC大模型对话功能-1-《MCU嵌入式AI开发笔记》 参考文档&#xff1a; 1、ESP32-S3-Korvo-2 V3.0的说明文档&#xff1a; https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/design-guide/d…

浪潮信息AIStation V5:一站式解决大模型挑战

7月9日&#xff0c;浪潮信息在济南“元脑中国行”巡展上隆重发布了AIStation V5升级版人工智能开发平台&#xff0c;该平台凭借全面的大模型流程支持能力&#xff0c;旨在为企业用户简化大模型构建与微调流程&#xff0c;提供标准化、安全可靠的推理服务&#xff0c;并通过优化…

[创业之路-142] :生产 - 产品名称、型号、物料编码、批次、产品结构、BOM单、SN序列号、SOP、版本、回溯等常见概念之间的相互的结构化关系。

目录 一、概念定义 1. 产品型号 2. 批次 3. 产品结构 4. 编码 5. 序列号 6. 版本 7. 物料编码 8. BOM单&#xff08;物料清单&#xff09; 9. 回溯 二、命名规则 2.1 产品型号命名规则 1、基本原则 2、命名要素 3、命名规则示例 4、注意事项 2.2 产品批次命名…

开放式耳机的优缺点?2024五款性能出色产品力荐!

开放式耳机以其独特的设计和使用体验在市场上逐渐受到欢迎。它们的主要优点包括提供舒适的佩戴感受和自然的声音表现&#xff0c;允许外界声音进入&#xff0c;从而在享受音乐的同时保持对周围环境的感知&#xff0c;特别适合户外运动或需要对周围环境保持警觉的场合。此外&…

android studio iguana monitor

android stuido 更新后很多菜单找不到了 其实都在view里面 但是还是没有Monitor 看不到设备的存储 新版本中确实没有 不用找了 Android Device Monitor | Android Studio | Android Developers 用这个 To open the Device Explorer, select View > Tool Windows >…

深圳表哥告诉你“上位机和SCADA的区别”

1、啥是上位机 ‌上位机&#xff08;Upper Computer&#xff09;是指‌可以直接发出操控命令的计算机‌&#xff0c;通常是主控计算机或监控系统&#xff0c;用于对整个控制系统进行监控和操作。上位机通过通信接口与下位机进行数据交换&#xff0c;发送控制命令并接收反馈数据…

如何使用 SQL Server 内置函数实现MD5加密

目录 前言 一、MD5加密 1、MD5加密的特点 2、MD5加密的应用场景 3、为什么MD5有用 二、使用 MD5 三、MD5加密示例 四、SQL截取字符串substring 总结 最后 前言 在互联网时代&#xff0c;我们的数据基本都是在暴露在外面&#xff0c;数据安全变得越来越重要。我们经常需…

网络接口(2)

一、粘包问题 原因&#xff1a;tcp流式套接字&#xff0c;数据与数据之间没有边界感&#xff0c;导致可能多次的数据粘到一起 解决办法&#xff1a; &#xff08;1&#xff09;、规定间隔符&#xff0c;如&#xff1a;“ \r\n”等&#xff1b; &#xff08;2&#xff09;、…

河道漂浮物监测识别摄像机

近年来&#xff0c;河道和湖泊污染日益严重&#xff0c;漂浮物的监测与识别成为一项迫切需要解决的环境问题。针对这一问题&#xff0c;科技人员研发了河道漂浮物监测识别摄像机。 河道漂浮物监测识别摄像机利用先进的图像识别技术&#xff0c;通过智能算法&#xff0c;可以在河…

动态规划-打家劫舍Ⅱ

该题是打家劫舍Ⅰ的升级版并与其相关&#xff0c;如果对其感兴趣的话可以先看看打家劫舍Ⅰ 题目描述 一个专业的小偷&#xff0c;计划偷窃一个环形街道上沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈 &#xff0c;这意味着第一个房屋和最后…

深度学习(10)---Vision Transformer详解

文章目录 一、简介二、模型结构2.1 整体架构2.2 Linear Projection of Flattened Patches2.3 Transformer Encoder2.4 MLP Head 三、ViT模型搭建参数四、思考题 一、简介 1. Vision Transformer&#xff08;ViT&#xff09;是一种基于Transformer架构的深度学习模型&#xff0c…

UE基础 —— Playing and Simulating

目录 Play In Editor 运行&#xff08;Play&#xff09; Play Modes PIE Console Simulate In Editor 可以随时在虚幻编辑器中预览游戏&#xff0c;无需将其构建为独立的应用程序&#xff1b;能快速调整游戏玩法和资产&#xff0c;并了解相应调整带来的结果&#xff1b; …

vue全局参数

/* eslint-disable no-new */ new Vue({el: #app,router,components: { App },template: <App/>,data:function(){return{wbWinList: [] // 定义的变量&#xff0c;全局参数}}, }) //使用全局参数 // this.$root.backgroundColor 666;其它页面如果想监听改变 //监听全…

【JAVA基础】this关键字与final关键字

文章目录 this关键字final关键字Java值传递 this关键字 this代表当前对象&#xff0c;有时候不太方便直接使用对象&#xff0c;可以用this **用法1&#xff1a;**this.属性名 在类中调用全局变量 举个例子&#xff1a; public class Student1 {public String name;public S…

密文域可逆信息隐藏与掩码自动编码器(MAE)

原文题目&#xff1a;Reversible data hiding in encrypted images based on pixel-level masked autoencoder and polar code Source: Signal Processing Authors: Zhangpei Cheng, Kaimeng Chen , Qingxiao Guan 发表年份&#xff1a;2024年 学习这篇文章主要原因是结合了…

Leetcode 46.全排列

注意的点&#xff1a; 1、回溯本质就是搜索树的树枝&#xff0c;维护三个核心变量&#xff1a;path&#xff08;需要恢复现场&#xff09;&#xff0c;visited&#xff08;需要恢复现场&#xff09;&#xff0c;以及res 解法&#xff1a;回溯算法 class Solution:def permut…

iphone问题笔记

拼音打字显示一些不相干的词 原因&#xff1a;开启了自动改正&#xff0c;傻逼iphone总以为你打错了。 计算器没有退格键&#xff1f; 解决方法&#xff1a;按住数字往右滑是退格。 关机重启必须去设置里&#xff1f; 连按五次锁屏可以选择关机。

[新手入门]1台电脑+1个电视+2个软件(sunshine+moonlight) 解决黑神话悟空没有hdmi线的痛...

sunshinemoonlight 解决黑神话悟空 本地串流投屏 背景:偶然间在B站发现了sunshinemoonlight方案,替代hdmi线,做本地串流...于是心灵手巧的我开始尝试踩坑之路:1.准备安装包2.开始安装2.1 笔记本windows安装sunshine2.2 遇到了第一个坑.Fatal: ViGEmBus is not installed or run…

matplotlib绘制子图以及局部放大效果

需求&#xff1a;绘制1*2的子图&#xff0c;子图1显示两个三角函数&#xff0c;子图2显示三个对数函数&#xff0c;子图2中对指定的区域进行放大。 绘图细节&#xff1a; 每个子图中每个函数的数据存放到一个列表中&#xff0c;然后将每个子图的数据统一存到一个列表中&#…