Springboot项目升级2.2.x升至2.7.x

news2025/1/11 8:17:29

依赖管理

spring-boot-starter-parent 升级为2.7.1

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
<!--        升级为2.7.x的版本-->
    <version>2.7.1</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

兼容老的配置文件格式,spring提供了专门的依赖进行兼容,但是建议还是在升级能成功运行之后进行配置的同步修改

<!--        升级2.7后支持yml环境变量名兼容-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-properties-migrator</artifactId>
    <scope>runtime</scope>
</dependency>

如果使用了bootstrap.yml文件,升级之后默认是不会使用bootstrap.yml了,所以可能会导致启动之后配置没有生效,需要引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
    <version>3.0.4</version>
</dependency>

配置修改

2.7.x不会处理循环依赖问题,需要手动配置修改application.yml添加配置spring.main.allow-circular-references

如果有nacos的使用,版本替换为:

<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-config -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2021.0.4.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2021.0.4.0</version>
</dependency>

同时需要支持yml配置,添加 spring.config.import

spring:
  profiles:
    active: "@profileActive@"
  application:
    name: saas
  cloud:
    nacos:
      server-addr: xx.xx.xx.xx:8848
      discovery:
        server-addr: xx.xx.xx.xx:8848
        namespace: f8f5c0c4-adc9-4c37-be6b-ddc
      config:
        server-addr: xx.xx.xx.xx:8848  #配置中心
        file-extension: yaml   #配置文件后缀名   dataId = application.name  +  file-extension
        namespace: f8f5c0c4-adc9-4c37-be6b-ddc
  config:
    import:
      - optional:nacos:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} #配置中心

报错问题定位思路

启动报错:

Web application could not be started as there was no org.springframework.boot.web.servlet.server.ServletWebServerFactory bean defined in the context.

最开始搜索报错,很多网上说的一般都是忘记加注解@SpringBootApplication,或者没有引入依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

但是检查并没有遗漏。开始根据问题本身进行定位。

报错本身就是没有找到ServletWebServerFactory,那么思路就是检查xxxxxxxConfiguration中的代码是否正常执行,这里就是org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration

因为是Tomcat方式启动所以只需要关心tomcatServletWebServerFactory方法

这里我设置了debug的方式但是并没有走到这里

再次全局搜索怀疑可能是自动装配的类org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration有问题

再次尝试debug发现依然没有走到,继续思考查看类上方相关的Conditional注解条件是否满足,猜测可能是@ConditionalOnWebApplication(type = Type.SERVLET)不满足

点进注解查看

继续查看对应的org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition,搜索刚才的相关的SERVLET,继续debug发现type为null直接返回了

继续查找调用的地方进行debug发现autoConfigurationMetadata传入的就有问题,很多value都是空字符串

继续定位到上级调用,发现传入的数据依然和上面一样存在问题

继续跟踪定位,终于调到了我们自己写的代码了

继续查看上级调用,发现这个类是我们自己拷贝出来的Springboot内部的类,做了一些自定义的改造

这里就说明,可能是从低版本的Springboot中拷贝出来的,但是升级到2.7.x之后可能存在对应的逻辑变化,所以需要对比一下,大概是哪些代码不一致

Ctrl+A全选Ctrl+C复制我们自己写的代码,然后跳进内部的AutoConfigurationImportSelector再进行比较

这里发现我们自己的代码少了一行

ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader()).forEach(configurations::add);

根据断言可以知道对应的这段代码不仅是读取了META-INF/spring.factories中的自动装配信息,还读取了META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中的自动装配的bean

最后查看了包结构,确实如此,升级后META-INF/spring.factories没有了ServletWebServerFactoryAutoConfiguration而是放到了META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中。最后解决就是复制对应的代码到自定义的类中,支持imports中的自动装配

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

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

相关文章

【STM32】WWDG—窗口看门狗

在一个设定好的区间进行喂狗 与独立看门狗不同的是&#xff0c;独立看门狗只需要在计时到0之前喂狗。而窗口看门狗需要在设定好的区间内进行喂狗&#xff0c;否则进行reset。 下限 递减计数器不断的往下递减计数&#xff0c;当减到一个固定值 0X40时还不喂狗的话&#xff0c…

《ADS2011射频电路设计与仿真实例》功率放大器设计的输入输出匹配

徐兴福这本书的6.6 Smith圆图匹配这一节中具体匹配时&#xff0c;直接给出了电容与串联微带的值&#xff0c;没有给出推导过程&#xff0c;我一开始以为是省略了详细推导过程&#xff0c;后来发现好像基本上是可以随便自己设的。以输入匹配&#xff08;书本6.6.4输入匹配电路的…

​安徽农业大学《乡村振兴战略下传统村落文化旅游设计》许少辉博士新著——2023学生开学季辉少许流动站

​安徽农业大学《乡村振兴战略下传统村落文化旅游设计》许少辉博士新著——2023学生开学季辉少许流动站

Archicad 26 for Mac - 打造卓越的3D建模工具

随着建筑设计和规划的日益复杂化&#xff0c;寻找一款功能强大且易于使用的3D建模工具变得至关重要。而Archicad 26 for Mac正是您在建筑设计领域中的理想选择。无论您是一名建筑师、室内设计师还是建筑工程师&#xff0c;Archicad 26都将成为您的得力助手。 作为一款全球领先…

计算机竞赛 深度学习 python opencv 动物识别与检测

文章目录 0 前言1 深度学习实现动物识别与检测2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存…

python脚本(渗透测试)

python爬取edusrc 通过此脚本&#xff0c;可以爬取edusrc的目标信息&#xff0c;生成目标字典&#xff0c;为下一步开发自动化测试工具做准备 import queue import threading import timeimport requests from bs4 import BeautifulSoup import re def get_edu_name():while …

算法-单词搜索 II

算法-单词搜索 II 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/word-search-ii/description/?envTypestudy-plan-v2&envIdtop-interview-150 1.2 题目描述 2 DFS 2.1 解题思路 每个格子往上下左右四个方向DFS&#xff0c;拼接后的单词如果在答案集中&…

【测试开发】基础篇 · 专业术语 · 软件测试生命周期 · bug的描述 · bug的级别 · bug的生命周期 · 处理争执

【测试开发】基础篇 文章目录 【测试开发】基础篇1. 软件测试生命周期1.1 软件生命周期1.2 软件测试生命周期 2. 描述bug3. 如何定义bug的级别3.1 为什么要对bug进行级别划分3.2 bug的一些常见级别 4. bug的生命周期5. 产生争执这么怎么办&#xff08;处理人际关系&#xff09;…

启山智软/电商商城100%开源

介绍 想要了解代码规范&#xff0c;学习商城解决方案&#xff0c;点击下方官网链接联系客服 作者&#xff1a;启山智软 官网及博客&#xff1a;启山智软官网、CSDN、掘金、gitee 简介&#xff1a;启山智软目前开发了全渠道电商商城系统&#xff0c;本商城是基于SpringCloud的商…

阿里云配置炼丹环境全流程 (从购买云服务器到成功运行代码)

自己的小破笔记本实在炼不动高品阶的丹药, 不得已用了云服务器. 捣鼓了一天, 终于是成功把代码在云服务器上跑起来了. 将这一过程记录一下, 方便之后参考. 第一步, 创建云服务器实例 找到控制台, 点 “云服务器 ECS”, 然后点击创建实例. 会出现以下界面: 这里如何选择合适的…

竞赛 基于深度学习的人脸性别年龄识别 - 图像识别 opencv

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

RocketMQ编程使用和应用场景

RocketMQ消息模型 一、RocketMQ客户端基本使用 引入RocketMQ依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>4.9.5</version> </dependency>ncy> RocketMQ…

哈希及哈希表的实现

目录 一、哈希的引入 二、概念 三、哈希冲突 四、哈希函数 常见的哈希函数 1、直接定址法 2、除留余数法 五、哈希冲突的解决 1、闭散列 2、开散列 一、哈希的引入 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找…

【Java 基础篇】Java标准输入流详解:读取用户输入的完整指南

Java是一门流行的编程语言&#xff0c;常用于开发各种类型的应用程序&#xff0c;包括控制台应用、桌面应用、Web应用等。在这些应用中&#xff0c;与用户进行交互是一项重要的任务。本文将重点介绍Java标准输入流&#xff0c;它是Java程序中用于从用户获取输入的关键组成部分。…

【unity小技巧】Unity 存储存档保存——PlayerPrefs、JsonUtility和MySQL数据库的使用

文章目录 前言PlayerPrefs一、基本介绍二、Demo三、优缺点 JsonUtility一、基本使用二、Demo三、优缺点 Mysql&#xff08;扩展&#xff09;完结 前言 游戏存档不言而喻&#xff0c;是游戏设计中的重要元素&#xff0c;可以提高游戏的可玩性&#xff0c;为玩家提供更多的自由和…

【JavaScript】video标签配置及相关事件:

文章目录 一、标签配置&#xff1a;二、事件&#xff1a;三、案例&#xff1a; 一、标签配置&#xff1a; 标签名描述src要播放的路径地址autoplay是否自动播放&#xff0c;默认值是false,&#xff08;Boolean&#xff09;loop是否循环播放&#xff0c;默认值是false,&#xf…

Hbase工作原理

Hbase&#xff1a;HBase 底层原理详解&#xff08;深度好文&#xff0c;建议收藏&#xff09; - 腾讯云开发者社区-腾讯云 Hbase架构图 同一个列族如果有多个store&#xff0c;那么这些store在不同的region Hbase写流程&#xff08;读比写慢&#xff09; MemStore Flush Hbas…

arm day2(9.15)数据操作指令,跳转指令,特殊功能寄存器指令,+XMind

作业 1.求最大公约数&#xff1a; .text .global _start _start:mov r0,#0x9mov r1,#0x15bl Loop Loop:cmp r0,r1 比较r0寄存器和r1寄存器的中的值beq stop 当两数相同时,退出程序subhi r0,r0,r1 r0>r1 r0 r0 - r1subcc r1,r1,r0 r0<r1 r1 r1 - r0mov pc,lr 恢复现…

自动驾驶行业观察之2023上海车展-----整体发展趋势

1.行业趋势 新能源势不可挡。 本次车展上首发了150多款新车&#xff0c;约有100款是新能源车;跨国车企全面电动化&#xff0c;但日韩系布局相对缓慢&#xff1b; 2.自主品牌 品牌持续向上 本届车展自主品牌开始疯狂向高端内卷&#xff0c;高端化态度坚决 &#xff08;包括仰…

Modbus RTU(Remote Terminal Unit)与RS-485协议介绍(主站设备(Master)、从站设备(Slave))

文章目录 Modbus RTU与RS-485协议介绍一、引言二、Modbus RTU 协议介绍2.1 Modbus RTU 协议简介2.2 Modbus RTU 协议帧结构主站设备、从站设备与从站设备地址2.3 Modbus RTU 协议举例 三、RS-485 协议介绍3.1 RS-485 协议简介3.2 RS-485 物理连接方式3.3 RS-485 与 Modbus RTU …