【Spring Boot】如何集成Swagger

  1. Swagger简单介绍
    1. Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。功能主要包含以下几点:
      1. 可以使前后端分离开发更加方便,有利于团队协作
      2. 接口文档可以在线自动生成,有利于降低后端开发人员编写接口文档的负担
      3. 可以进行接口功能测试
    2. 我们使用Swagger只需要按照它的规范去定义接口及接口相关的信息,再通过Swagger衍生出来的一系列项目和工具,就可以做到生成各种格式的接口文档以及在线接口调试页面等等
  2. knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,接下来我们就在spring boot项目中集成knife4j。
  3. spring boot项目中使用knife4j框架
    1. 首先我们在maven项目的pom.xml文件中导入knife4j的坐标
      1.         <dependency>
                    <groupId>com.github.xiaoymin</groupId>
                    <artifactId>knife4j-spring-boot-starter</artifactId>
                    <version>3.0.3</version>
                </dependency>
    2. 导入knife4j的相关配置类
      1. 因为是spring mvc的集成,所以我们将创建一个WebMvcConfig类,然后在里面加入相关的bean声明就可以了
        1. 在配置类上加上@EnableSwagger2、@EnableKnife4j注解,以便开启Swagger和Knife4j的功能
        2. 在配置类中声明一个Docket类型的bean, 通过该bean来指定生成文档的相关信息
        3. 由于Swagger生成的在线文档中,涉及到很多静态资源,这些静态资源需要添加静态资源映射,否则接口文档页面无法访问。因此需要在 WebMvcConfig类中的addResourceHandlers方法中增加如下配置
          1.     @Override
                protected void addResourceHandlers(ResourceHandlerRegistry registry) {
                    log.info("开始进行静态资源映射...");
                    // 添加Swagger生成的在线文档的相关静态资源映射
                    registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
                    registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
                }
      2. package com.app.studypro.config;
        
        import com.app.studypro.common.JacksonObjectMapper;
        import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
        import lombok.extern.slf4j.Slf4j;
        import org.springframework.context.annotation.Bean;
        import org.springframework.context.annotation.Configuration;
        import org.springframework.http.converter.HttpMessageConverter;
        import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
        import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
        import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
        import springfox.documentation.builders.ApiInfoBuilder;
        import springfox.documentation.builders.PathSelectors;
        import springfox.documentation.builders.RequestHandlerSelectors;
        import springfox.documentation.service.ApiInfo;
        import springfox.documentation.spi.DocumentationType;
        import springfox.documentation.spring.web.plugins.Docket;
        import springfox.documentation.swagger2.annotations.EnableSwagger2;
        
        import java.util.List;
        
        /**
         * Spring mvc的配置设定
         *
         * @author Administrator
         */
        @Slf4j
        @Configuration
        @EnableSwagger2
        @EnableKnife4j
        public class WebMvcConfig extends WebMvcConfigurationSupport {
        
            @Override
            protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
                log.info("扩展消息转换器,自定义添加 {} 消息转化器到spring mvc中", JacksonObjectMapper.class);
                // 创建消息转换器对象
                MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
                // 设置对象转换器,底层使用Jackson将Java对象转为json
                messageConverter.setObjectMapper(new JacksonObjectMapper());
                // 将上面的消息转换器对象追加到mvc框架的转换器集合中,将其放在转换器集合的首个位置
                converters.add(0, messageConverter);
            }
        
            @Bean
            public Docket createRestApi() {
                // 创建api文档信息
                ApiInfo apiInfo = new ApiInfoBuilder()
                        // 设置api文档标题
                        .title("学习操作项目")
                        // 设置api文档的版本
                        .version("1.0")
                        // 设置api文档的描述信息
                        .description("学习操作项目接口文档").build();
        
                // 文档类型
                return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo).select()
                        // Docket声明时,指定一个包扫描的路径,该路径指定的是Controller所在包的路径。
                        // 因为Swagger在生成接口文档时,就是根据这里指定的包路径,自动的扫描该包下的@Controller,@RestController,@RequestMapping等SpringMVC的注解,依据这些注解来生成对应的接口文档
                        .apis(RequestHandlerSelectors.basePackage("com.app.studypro.controller")).paths(PathSelectors.any()).build();
            }
        
            /**
             * 静态资源映射
             *
             * @param registry 资源处理器
             */
            @Override
            protected void addResourceHandlers(ResourceHandlerRegistry registry) {
                log.info("开始进行静态资源映射...");
                // 添加Swagger生成的在线文档的相关静态资源映射
                registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
                registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
            }
        
        }
        
    3. 若系统中存在授权才可以请求的路径filter或者拦截器,则需要将下列路径在系统中放行。这样将Swagger及Knife4j相关的静态资源直接放行之后,我们才可以免授权方式直接访问接口文档的页面。放行的url如下所示
      1. "/doc.html",
        "/webjars/**",
        "/swagger-resources",
        "/v2/api-docs"
  4. 查看接口文档信息
    1. 我们根据上面的方式集成配置之后,那么我们的项目集成Swagger及Knife4j就已经完成了,接下来我们可以启动我们的项目,然后访问接口文档,本地的访问链接为:http://127.0.0.1:8080/doc.html
    2. 通过接口文档我们可以看出,我们所有的Controller中提供的所有的业务增删改查的接口,全部都已经自动生成了,并且我们通过接口文档可以看到请求的url、请求方式、请求参数、请求实例、响应的参数,响应的示例。 同时我们也可以通过这份在线的接口文档,对接口进行测试
    3. 如果我们部分的接口需要系统授权之后才可以访问,那么我们在调用这些接口时,需要先调用获取授权的方法,然后再调用需要授权的接口,这样才可以正常的访问授权接口
    4. Knife4j还支持离线文档,对接口文档进行下载,支持下载的格式有:markdown、html、word、openApi

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二叉树经典面试题—折纸

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 1 折纸问题1.1 解决思路1.2 实现代码 &#x1f48e;总结 1 折纸问题 1.1 解决思路 请把一段纸条竖着放在桌子上&#xff0c;然后从纸条的下边向上方对折1次&#xff0c;压出折痕后展开。此时折痕是凹下去的&#xf…

包你学会十大内排序算法,广度深度兼备,动图演示,详细源码

内排序算法合集 文章目录 内排序算法合集前言冒泡排序冒泡排序的实现冒泡排序的简单实现冒泡排序的优化版本冒泡排序的复杂度分析 简单选择排序简单选择排序的实现简单选择排序的复杂度分析 直接插入排序直接插入排序的实现直接插入排序的复杂度分析 希尔排序希尔排序原理希尔排…

059-第三代软件开发-巧用工控板LED指示灯引脚

第三代软件开发-巧用工控板LED指示灯引脚 文章目录 第三代软件开发-巧用工控板LED指示灯引脚项目介绍巧用工控板LED指示灯引脚第一种方式第二种方式 总结 关键字&#xff1a; Qt、 Qml、 Power、 继电器、 IO 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项…

Leetcode—28.找出字符串中第一个匹配项的下标【简单】

2023每日刷题&#xff08;四十&#xff09; Leetcode—28.找出字符串中第一个匹配项的下标 实现代码 int strStr(char* haystack, char* needle) {int len1 strlen(haystack);int len2 strlen(needle);int idx -1;int i 0;while(i < len1 - len2) {if(strncmp(haystac…

Django之admin页面样式定制(Simpleui)

好久不见&#xff0c;各位it朋友们&#xff01; 本篇文章我将向各位介绍Django框架中admin后台页面样式定制的一个插件库&#xff0c;名为Simpleui。 一&#xff09;简介 SimpleUI是一款简单易用的用户界面&#xff08;UI&#xff09;库&#xff0c;旨在帮助开发人员快速构建…

数据库基础教程之创建触发器,实现自动更新时间戳(四)

postgresql 更新时间戳需要通过触发器来实现,这里给出两种方法来实现。 创建字段create_time和edit_time 通过Navicat在添加字段时候将字段设置为timestamp类型,生成时间戳方式为CURRENT_TIMESTAMP或者设置为now(),然后点击保存。 新建函数 点击函数,然后在弹出的函数向导中…

ubuntu22.04中ros2 安装rosbridge

ros2 启动rosbridge&#xff1a; 要启动ROS2中的rosbridge&#xff0c;需要先安装ROS2的rosbridge_suite软件包。使用以下命令安装&#xff1a; 更新过可忽略 sudo apt-get update安装命令 sudo apt-get install ros--rosbridge-suite 注意&#xff1a; 将替换为正在使用的R…

rtsp点播异常出现‘circluar_buffer_size‘ option was set but it is xx

先说现象: 我使用potplay播放器来点播rtsp码流的时候可以点播成功&#xff0c;同事使用vlc和FFplay来点播rtsp码流的时候异常。 排查思路: 1.开始怀疑是oss账号问题&#xff0c;因为ts切片数据是保存在oss中的&#xff0c;我使用的是自己的oss账号&#xff0c;同事使用的是公司…

常见的1/2/3位数码管接线详解

今天玩数码管的时候接触到了数码管的接线&#xff0c;分享一下供刚开始接触的童鞋参考 首先了解什么是数码管 数码管是一种可以显示数字和其他信息的电子设备&#xff0c;是显示屏其中一类&#xff0c; 通过对其不同的管脚输入相对的电流&#xff0c;会使其发亮&#xff0c;从而…

哲学家就餐问题

文章目录&#xff1a; 问题描述及分析一次错误的尝试解决方案一解决方案二 问题描述及分析 哲学家就餐问题规定了有5位哲学家正在进行思考和就餐两种活动。用餐在一个桌子上进行&#xff0c;桌子上面有5个盘子和5个叉子&#xff0c;按照循环的方式分配。 问题的约束条件&#…

【数据中台】开源项目(2)-Wormhole流式处理平台

Wormhole 是一个一站式流式处理云平台解决方案&#xff08;SPaaS - Stream Processing as a Service&#xff09;。 Wormhole 面向大数据流式处理项目的开发管理运维人员&#xff0c;致力于提供统一抽象的概念体系&#xff0c;直观可视化的操作界面&#xff0c;简单流畅的配置管…

【React】Memo

组件重新渲染时缓存计算的结果。 实例&#xff1a;count1计算斐波那契数列&#xff0c;count2和count1可以触发数值变化。使用memo可以使只有在count1变化时触发斐波那契数列计算函数&#xff0c;而count2变化时不触发斐波那契数列计算函数。 import { useMemo } from "r…

二十六、搜索结果处理(排序、分页、高亮)

目录 一、排序 二、分页 1、深度分页问题 2、三种方案的优缺点 &#xff08;1&#xff09;fromsize 优点&#xff1a; 缺点&#xff1a; 场景&#xff1a; &#xff08;2&#xff09;after search 优点&#xff1a; 缺点&#xff1a; 场景&#xff1a; &#xff0…

git的使用:本地git下载、sshkey的添加、github仓库创建及文件上传

一、github创建账号 即github注册账号&#xff0c;登录github官网&#xff0c;根据提示注册即可 github官网 二、git客户端下载安装 已有很多git下载安装的博文了&#xff0c;在此就不赘述 三、sshkey的生成与添加 1、sshkey的生成以及查看 // sshkey的生成命令&#xff…

【代码】考虑电解槽变载启停特性与阶梯式碳交易机制的综合能源系统优化调度matlab-yalmip-cplex/gurob

程序名称&#xff1a;考虑电解槽变载启停特性与阶梯式碳交易机制的综合能源系统优化调度 实现平台&#xff1a;matlab-yalmip-cplex/gurobi 代码简介&#xff1a;提出了一种考虑 变载启停特性的电解槽混合整数线性模型&#xff0c;根据电 氢负荷可以实时调整设备工作状态&…

Leetcode211. 添加与搜索单词 - 数据结构设计

Every day a Leetcode 题目来源&#xff1a;211. 添加与搜索单词 - 数据结构设计 解法1&#xff1a;字典树 字典树&#xff08;前缀树&#xff09;是一种树形数据结构&#xff0c;用于高效地存储和检索字符串数据集中的键。前缀树可以用 O(∣S∣) 的时间复杂度完成如下操作…

Linux进程通信——信号量

概念 信号量(semaphore) 与已经介绍过的 PC 结构不同&#xff0c;它是一个计数器。信号量用于实现进程间的互斥与同步&#xff0c;而不是用于存储进程间通信数据。 特点 1.信号量用于进程间同步&#xff0c;若要在进程间传递数据需要结合共享内存 2.信号量基于操作系统的 PV…

VUE简易计划清单

目录 效果预览图 完整代码 效果预览图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

嵌入式的学习需要合理规划时间

低级的欲望放纵即可获得&#xff0c;高级的欲望只有克制才能达成。——卡耐基1、粉丝的误会 很多粉丝&#xff0c;问我&#xff0c; "胡老师我想报您的培训班。" ... 得知我知识业余时间写文章&#xff0c;紧接着又会问&#xff0c; "jg单位这么清闲啊&#…

粉丝提问:写博文怎样才能变现啊?

文章目录 粉丝提问&#xff1a;写博文怎样才能变现啊&#xff1f;我总结了一下博客变现的几个途径&#xff1a;另外做技术博主的五大好处 后记 粉丝提问&#xff1a;写博文怎样才能变现啊&#xff1f; type: Post status: Published date: 2023/11/26 tags: 推荐 category…