前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >升级 SpringBoot 2.6.x 版本后,Swagger 没法用了!

升级 SpringBoot 2.6.x 版本后,Swagger 没法用了!

作者头像
macrozheng
发布于 2022-04-12 07:14:09
发布于 2022-04-12 07:14:09
2.9K00
代码可运行
举报
文章被收录于专栏:mall学习教程mall学习教程
运行总次数:0
代码可运行

最近想体验下最新版本的SpringBoot,逛了下官网,发现SpringBoot目前最新版本已经是2.6.4了,版本更新确实够快的。之前的项目升级了2.6.4版本后发现有好多坑,不仅有循环依赖的问题,连Swagger都没法用了!今天给大家分享下升级过程,填一填这些坑!

聊聊SpringBoot版本

首先我们来聊聊SpringBoot的版本,目前最新版本是2.6.4版本,2.7.x即将发布,2.4.x及以下版本已经停止维护了,目前的主流版本应该是2.5.x2.6.x。具体可以看下下面这张表。

升级过程

下面我们将之前的mall-tiny-swagger项目升级下,看看到底有哪些坑,这些坑该如何解决!

添加依赖

首先在pom.xml中修改SpringBoot的版本号,注意从2.4.x版本开始,SpringBoot就不再使用.RELEASE后缀了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.4</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

循环依赖

  • 启动项目后,由于SpringBoot禁止了循环引用,我们会遇到第一个问题,securityConfigumsAdminServiceImpl循环引用了,具体日志如下;
  • 具体来说就是我们的SecurityConfig引用了UmsAdminService
  • UmsAdminServiceImpl又引用了PasswordEncoder
  • 由于SecurityConfig继承了WebSecurityConfigurerAdapter,而Adapter又引用了PasswordEncoder,这样就导致了循环引用。
  • 要解决这个问题其实很简单,你可以修改application.yml直接允许循环引用,不过这个方法有点粗暴,在没有其他方法的时候可以使用;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  main:
    allow-circular-references: true
  • 其实循环引用主要是因为会导致Spring不知道该先创建哪个Bean才会被禁用的,我们可以使用@Lazy注解指定某个Bean进行懒加载就可以优雅解决该问题,比如在SecurityConfig中懒加载UmsAdminService

启动出错

  • 再次启动SpringBoot应用后会出现一个空指针异常,一看就是Swagger问题,原来挺好用的Swagger不能用了!
  • 在Swagger的配置类中添加如下Bean可以解决该问题;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Swagger2API文档的配置
 */
@Configuration
public class Swagger2Config {

    @Bean
    public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
        return new BeanPostProcessor() {

            @Override
            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
                    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);
                }
            }
        };
    }

}

文档无法显示

  • 再次启动后访问Swagger文档,会发现之前好好的文档也无法显示了,访问地址:http://localhost:8088/swagger-ui/
  • 修改application.yml文件,MVC默认的路径匹配策略为PATH_PATTERN_PARSER,需要修改为ANT_PATH_MATCHER
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  mvc:
    pathmatch:
      matching-strategy: ANT_PATH_MATCHER
  • 再次启动后发现Swagger已经可以正常使用了!

聊聊springfox

提到Swagger,我们一般在SpringBoot中集成的都是springfox给我们提供的工具库,看了下官网,该项目已经快两年没有发布新版本了。

再看下Maven仓库中的版本,依旧停留在之前的3.0.0版本。如果springfox再不出新版本的话,估计随着SpringBoot版本的更新,兼容性会越来越差的!

总结

今天带大家体验了一把SpringBoot升级2.6.x版本的过程,主要解决了循环依赖和Swagger无法使用的问题,希望对大家有所帮助!

参考资料

官网地址:https://github.com/springfox/springfox

项目源码地址

https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-swagger2

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 macrozheng 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Mysql 多表查询详解
上篇讲到Mysql中关键字执行的顺序,只涉及了一张表;实际应用大部分情况下,查询语句都会涉及到多张表格 :
全栈程序员站长
2022/09/04
2.2K0
Mysql 多表查询详解
MySQL:查询(万字超详细版)
之后,可以通过as关键字来为查询结果中的列指定别名,as和引号可以省略,但如果别名中存在空格就不能省略引号了
2的n次方
2024/10/15
8680
MySQL:查询(万字超详细版)
MySQL基础之多表查询
项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:
叫我阿杰好了
2022/11/07
6640
MySQL基础之多表查询
【MySQL】多表联合查询、连接查询、子查询「建议收藏」
内连接:[inner] join:从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留.
全栈程序员站长
2022/08/02
5.3K0
【MySQL】多表联合查询、连接查询、子查询「建议收藏」
MySQL 多表查询
多表查询是指基于两个和两个以上的表查询.在实际应用中,查询单个表可能不能满足你的需求.
用户9615083
2022/12/25
4.3K0
MySQL 多表查询
【MySQL】:深入解析多表查询(下)
自连接查询,顾名思义,就是自己连接自己,也就是把一张表连接查询多次。我们先来学习一下自连接的查询语法:
屿小夏
2024/04/18
2780
【MySQL】:深入解析多表查询(下)
【MySQL】函数 & 复合查询 & 内外连接
【案例】:基于我们上面 Retrieve 那建的表 exam_result,同样这里只写指令,不写结果
IsLand1314
2025/05/23
1460
【MySQL】函数 & 复合查询 & 内外连接
Mysql基础8-多表查询
    说明2:as dept_name 是给dept.name 起的别名,防止查询结果中出现两个name字段,会有歧义
Se7eN_HOU
2023/07/24
4000
Mysql基础8-多表查询
MySQL 性能优化总结
https://www.cnblogs.com/joeyJss/p/11096597.html
Lenis
2019/12/25
1.1K0
MySQL 性能优化总结
MySQL多表查询
单表查询:select * from table1; 多表查询:select *from table1,table2;
WuShF
2023/09/21
4530
MySQL多表查询
多表查询与7种JOINS的实现
前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠“部门编号”进行关联。
timerring
2023/02/16
1.5K0
多表查询与7种JOINS的实现
MySQL常用SQL语句:插入更新删除查询
整理一些MySQL常用SQL语句:插入、更新、删除、查询、根据指定的列对结果集进行排序等。
星哥玩云
2022/08/16
7.1K0
MySQL常用SQL语句:插入更新删除查询
MySQL查询优化
     一个好的web应用,最重要的一点是有着优秀的访问性能。数据库MySQL是web应用的组成部分,也是决定其性能的重要部分。所以提升MySQL的性能至关重要。
那一叶随风
2018/08/22
2.1K0
SQL 多表查询:数据整合与分析的强大工具
在关系型数据库中,数据通常被组织在多个表中。这种表的分离有助于减少冗余并提高数据的管理效率。然而,在实际应用中,往往需要对多个表中的数据进行整合查询,来获得更完整的信息。这时候,多表查询(Join)就显得至关重要。本文将详细介绍 SQL 中常见的多表查询类型,并通过实际示例帮助大家理解如何高效地利用这些查询方法。
平凡之路.
2025/04/24
2940
【MySQL】02_子查询与多表查询
指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入。
鸡先生
2022/10/29
2.9K0
【MySQL】02_子查询与多表查询
MySQL4_联合-子查询-视图-事务-索引
文章目录 MySQL_联合-子查询-视图-事务-索引 1.联合查询 关键字:`union` 2.多表查询 多表查询的分类 内连接(inner join ... on ..) 外连接(outer join) 思考: 交叉连接(cross join) 自然连接(natural join) using函数 练习 3.子查询 in | not in some | any | all exists | not exists 子查询分组 4.视图 创建视图 查询 修改视图 查看创建视图的语句 查看视图的结构 查看所有的
以某
2023/03/07
1.1K0
Mysql常用查询语句
一查询数值型数据: SELECT * FROM tb_name WHERE sum > 100; 查询谓词:>,=,<,<>,!=,!>,!<,=>,=<
Java架构师历程
2018/09/26
5.5K0
MySQL多表联合查询
例 2:查询 tb_course 表中的 id 字段和 tb_students_info 表中的 course_id 字段相等的内容
Alone-林
2022/08/20
10.9K0
手把手教你 SQL 多表查询
本文通过经典的学生-课程模式 S-T 数据库带大家学习 SQL 常用的多表查询 :
wsuo
2020/07/31
1.9K0
手把手教你 SQL 多表查询
【MySQL】多表查询全解-【多表关系/内外自连接/子查询/多表查询案例链接】(可cv代码&案例演示)
YY的秘密代码小屋
2024/04/03
1.9K0
【MySQL】多表查询全解-【多表关系/内外自连接/子查询/多表查询案例链接】(可cv代码&案例演示)
相关推荐
Mysql 多表查询详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档