《springboot实战》 第十二章 SpringBoot整合swagger-bootstrap-ui

news2025/1/18 17:00:46

前言

SpringBoot整合swagger,使用swagger-bootstrap-ui美化页面。

1、环境配置

1.1、导入依赖包

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

        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>swagger-bootstrap-ui</artifactId>
            <version>1.9.6</version>
        </dependency>

1.2、在config目录下增加Swagger3Config配置


import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ReflectionUtils;
import org.springframework.web.context.request.async.DeferredResult;
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
import java.lang.reflect.Field;
import java.util.List;
import java.util.stream.Collectors;

@EnableOpenApi
@Configuration
public class Swagger3Config {

    @Bean
    public Docket createRestApi(){
        return new Docket(DocumentationType.OAS_30)
                .genericModelSubstitutes(DeferredResult.class)
                .useDefaultResponseMessages(false)
                .forCodeGeneration(false)
                .pathMapping("/")
                .select()
                .build()
                .apiInfo(apiInfo());

    }
    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title("Swagger3接口文档")
                .description("前后端分离的接口文档")
                .version("1.0")
                .build();
    }
    @Bean
    public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
        return new BeanPostProcessor() {
            @Override
            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                if (bean instanceof WebMvcRequestHandlerProvider) {
                    customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
                }
                return bean;
            }

            private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(
                    List<T> mappings) {
                List<T> copy = mappings.stream().filter(mapping -> mapping.getPatternParser() == null)
                        .collect(Collectors.toList());
                mappings.clear();
                mappings.addAll(copy);
            }

            @SuppressWarnings("unchecked")
            private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
                try {
                    Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
                    field.setAccessible(true);
                    return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
                }
                catch (IllegalArgumentException | IllegalAccessException e) {
                    throw new IllegalStateException(e);
                }
            }
        };
    }
}


1.3、为Swagger3配置ResourceHandlers

含【Swagger3资源配置】、【静态资源配置】


import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        //加载public文件夹数据
        registry.addResourceHandler("/public/**")
                .addResourceLocations("classpath:/public/");

        //加载static文件夹数据
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/static/");

        // swagger配置
        registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");

    }

}

2、应用

2.1、@Api 应用在Controller上

tags :API的展示顺序,例如:1. 2. 3. 4.

@Slf4j
@Api(value = "用户服务", tags = "1.用户模块")
@RestController
@CrossOrigin("*")
@RequestMapping("/user")
public class UserController {
}

@Slf4j
@Api(value = "订单模块", tags = "2.订单模块")
@RestController
@RequestMapping("/order")
public class OrderController {
}

在这里插入图片描述

2.2、@ApiOperation 应用在Method上

 @ApiOperation(value = "获取订单信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "pageObj", value = "分页信息", paramType = "query", dataType = "com.hqyj.springbootmybatis.util.PageObj" )
    })
    @GetMapping("/getOrderList")
    public HttpResult getCurrentUserOrderList(PageObj pageObj) {
        log.info("当前查询第几页:{} , 一页数据量:{}" , pageObj.getCurrentPage() , pageObj.getPageSize());
        List<Order> list = new ArrayList<>();
        return HttpResultGenerator.success(list);
    }

3、访问

项目路径 + /doc.html : http://localhost/doc.html
在这里插入图片描述

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

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

相关文章

不得不说的结构型模式-代理模式

目录 代理模式&#xff1a; 下面是一个简单的C代码案例 下面是面试中可能遇到的问题&#xff1a; 代理模式&#xff1a; 代理模式是一种结构型设计模式&#xff0c;它通过引入一个代理对象来控制对另一个对象的访问。代理对象充当原始对象的中介&#xff0c;通过拦截对原始…

倾斜摄影超大场景的三维模型的顶层合并的点云抽稀处理技术分析

倾斜摄影超大场景的三维模型的顶层合并的点云抽稀处理技术分析 倾斜摄影超大场景的三维模型的顶层合并需要进行点云抽稀处理&#xff0c;以减小数据量和提高数据处理和展示性能。以下是几种常用的点云抽稀处理技术&#xff1a; 1、体素栅格化&#xff1a;将点云数据转换为3D体…

【TCP 协议】报文格式,数据可靠传输的机制(一)

哈喽&#xff0c;大家好~我是你们的老朋友&#xff1a;保护小周ღ 本期为大家带来的是网络编程的 TCP 传输控制协议的概念 &#xff0c;首先会讲解 TCP 协议的报文格式&#xff0c;在学习报文格式之后&#xff0c;会学习两种 TCP 保证数据可靠传输的机制&#xff0c;确认应答…

getType() 和 getGenericType()的区别

处理泛型时会经常用到这两个方法&#xff0c;但是二者的区别是什么&#xff1f; 先看看官方的解释&#xff1a; getType 》&#xff1a;Returns a Class object that identifies the declared type for the field represented by this Field object. 返回字段对象声明类型的…

nodejs+python+php+springboot+vue 婚庆公司服务网站管理系统

管理员模块 &#xff08;1&#xff09;信息管理模块&#xff1a;对商家和个人的查看&#xff0c;修改。 &#xff08;2&#xff09;留言管理模块&#xff1a;对留言进行管理&#xff0c;确定是否能进行发布&#xff0c;对留言进行回复。 &#xff08;3&#xff09;权限管理&…

Git常用命令2

git commit --amend 有时候我们提交完了才发现漏掉了几个文件没有添加&#xff0c;或者提交信息写错了。 此时&#xff0c;可以运行带有 --amend 选项的提交命令来重新提交,这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改&#xff08;例如&#xff0c;…

【C++入门】一篇搞懂auto关键字

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】 目录 作用不那么大的场景auto真正的价值注意点auto不能推导的场景范围for范围for的使用条件 作用不那么大的场景 在C中推出了…

工业元宇宙对于制造业的影响有哪些?

伴随元宇宙的快速发展&#xff0c;它在诸多现实场景中都实现了广泛应用&#xff0c;特别是在全球科技与产业竞争核心的智能制造领域。元宇宙与智能制造融合的本质是重构企业研发、制造、销售、终端四大场景&#xff0c;相当于把企业打包进虚拟世界&#xff0c;在虚拟世界中建设…

(五)ArcCatalog应用基础——ArcCatalog基本操作

&#xff08;二&#xff09;ArcCatalog应用基础——ArcCatalog基本操作 当ArcCatalog 与文件夹、数据库或者 GIS 服务器建立链接之后&#xff0c;就可以通过 ArcCatalog 来浏览其中的内容。ArcCatalog 具有浏览地图和数据、创建元数据、搜索地图数据、管理数据源等功能&#x…

SpringBoot RabbitMQ 死信队列

1. 死信定义 无法被消费的消息&#xff0c;称为死信。 如果死信一直留在队列中&#xff0c;会导致一直被消费&#xff0c;却从不消费成功&#xff0c;专门有一个存放死信的队列&#xff0c;称为死信队列(DDX, dead-letter-exchange)。 死信队列 DLX&#xff0c;Dead Letter Exc…

火山引擎 BVE 视频图片硬件编码器演进之路

动手点关注 干货不迷路 前言 近日&#xff0c;第 17 届世界编码器大赛 MSU 2022 公布硬件编码器比赛结果&#xff0c;在 60 fps&#xff08;帧率&#xff09;的超快视频编码赛道上&#xff0c;火山引擎多媒体实验室自主研发的 BVE 1.1 编码器表现突出&#xff0c;荣获最佳 FPGA…

计算机网络学习06(HTTP1.0 vs HTTP1.1)

1、响应状态码 HTTP/1.0仅定义了16种状态码。HTTP/1.1中新加入了大量的状态码&#xff0c;光是错误响应状态码就新增了24种。比如说&#xff0c;100 (Continue)——在请求大资源前的预热请求&#xff0c;206 (Partial Content)——范围请求的标识码&#xff0c;409 (Conflict)…

【C++】priority_queue使用和模拟实现——仿函数

文章目录 1. priority_queue的使用1.priority_queue的介绍2.priority_queue的结构3. 主要接口4. 使用示例 2. 仿函数1. 仿函数的概念2.尝试实现仿函数 3.priority_queue的模拟实现1.priority_queue的结构2. 接口实现1.向下调整算法2. 向上调整算法3.构造函数4.修改数据5.获取数…

机器学习 -Statsmodels

机器学习记录 Statsmodels 用于探索数据, 估计模型, 并运行统计检验. conda install -y statsmodels线性回归 import numpy as np import pandas as pd import matplotlib.pyplot as plt import statsmodels.api as sm import statsmodels.datasets.utils as du import sea…

数据结构【二】:霍夫曼编码

霍夫曼编码&#xff08;Huffman Coding&#xff09;是可变长编码&#xff08;VLC&#xff09;的一种。本质上使用变长编码表对源符号进行编码&#xff0c;通过评估源符号出现概率的方法进行分类&#xff0c;将出现几率较高的源字符使用较短的编码&#xff0c;出现几率较低的源字…

Hive优化补充

目录 一、表设计优化 1.通过设计分区表&#xff0c;增加动态分区&#xff0c;查询时避免全表扫描 2.设计分桶表&#xff1a;适用于大表join大表的情况 最后&#xff0c;两张大表进行join转为两张分桶表进行join&#xff1a; 二、文件存储 1.文件格式-概述 2.文件格式——…

学系统集成项目管理工程师(中项)系列13b_人力资源管理(下)

1. 项目团队建设 1.1. 塔克曼(Tuckman)阶梯理论 1.2. 理论基础 1.2.1. 激励理论 1.2.1.1. 马斯洛需要层次理论 1.2.1.1.1. 生理需要 1.2.1.1.2. 安全需要 1.2.1.1.3. 社会交往的需要 1.2.1.1.4. 自尊的需要 1.2.1.1.5. 自我实现的需要 1.2.1.2. 赫茨伯格的双因素理论…

Leetcode力扣秋招刷题路-0802

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 802. 找到最终的安全状态 有一个有 n 个节点的有向图&#xff0c;节点按 0 到 n - 1 编号。图由一个 索引从 0 开始 的 2D 整数数组 graph表示&#xff0c; graph[i]是与节点 i 相邻的节…

Git HEAD及detached head

背景&#xff1a;最近在使用git checkout重置HEAD指向&#xff0c;偶尔会出现Detached HEAD提示&#xff0c;于是想探究一下具体的原理及过程&#xff0c;遂写下了这篇文章。一般checkout用于切换分支和检出历史的某个节点&#xff0c;或恢复工作区的文件&#xff0c;这三个功能…

OpenHarmony JS Demo开发讲解

项目结构 打开entry→src→main→js&#xff0c;工程的开发目录如图所示 其中&#xff0c; i18n文件夹&#xff1a;用于存放配置不同语言场景的资源&#xff0c;比如应用文本词条&#xff0c;图片路径等资源。en-US.json文件定义了在英文模式下页面显示的变量内容&#xff0c…