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

这篇具有很好参考价值的文章主要介绍了Springboot项目升级2.2.x升至2.7.x。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

依赖管理

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

升级springboot2.7,数据库,java,mysql

如果有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方法

升级springboot2.7,数据库,java,mysql

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

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

升级springboot2.7,数据库,java,mysql

升级springboot2.7,数据库,java,mysql

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

点进注解查看

升级springboot2.7,数据库,java,mysql

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

升级springboot2.7,数据库,java,mysql

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

升级springboot2.7,数据库,java,mysql

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

升级springboot2.7,数据库,java,mysql

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

升级springboot2.7,数据库,java,mysql

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

升级springboot2.7,数据库,java,mysql

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

升级springboot2.7,数据库,java,mysql

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

升级springboot2.7,数据库,java,mysql

升级springboot2.7,数据库,java,mysql

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

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

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

升级springboot2.7,数据库,java,mysql

最后查看了包结构,确实如此,升级后META-INF/spring.factories没有了ServletWebServerFactoryAutoConfiguration而是放到了META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中。最后解决就是复制对应的代码到自定义的类中,支持imports中的自动装配文章来源地址https://www.toymoban.com/news/detail-778583.html

到了这里,关于Springboot项目升级2.2.x升至2.7.x的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【重磅】:Spring Initializer 已经不支持Java8,也就是SpringBoot2.x项目初始化

    我们可以看到在IDEA内置的Spring Initializer中 Java版本选择模块已经不支持1.8了,同样的,官网也不再支持了 Spring Boot 3.x要求 Java最低版本为17, 最新的SpringBoot版本已经要求Java21了 所以,你可以升级Java版本,使用SpringBoot3.X 我们可以尝试查看一下, 访问Spring官网,按照下图操作

    2024年02月04日
    浏览(50)
  • 【大学生体质】图书管理系统(Vue+SpringBoot2)-完整部署教程【课设OR毕设提供API接口文档、数据库文件、README.MD、部署视频】

    本项目拥有完整的API后台接口文档(文尾) 项目部署视频正在录制 如果项目对您有所帮助,可以Star⭐一下,受到鼓励的我会继续加油。 项目在线演示地址 项目前端地址 项目后端地址 项目部署视频 ☃️前端主要技术栈 技术 作用 版本 Vue 提供前端交互 2.6.14 Vue-Router 路由式编

    2024年01月18日
    浏览(49)
  • springboot 数据库版本升级管理常用解决方案

    目录 一、前言 1.1 单独执行初始化sql 1.2 程序自动执行 二、数据库版本升级管理问题

    2024年02月13日
    浏览(54)
  • 【SpringBoot2】SpringBoot开发实用篇

    ​ 什么是热部署?简单说就是你程序改了,现在要重新启动服务器,嫌麻烦?不用重启,服务器会自己悄悄的把更新后的程序给重新加载一遍,这就是热部署。 ​ 热部署的功能是如何实现的呢?这就要分两种情况来说了,非springboot工程和springboot工程的热部署实现方式完全

    2023年04月25日
    浏览(40)
  • Springboot项目升级jdk11

    下载jdk11 安装 配置环境变量 java -version查看版本,是否配置成功 参考: jdk11 下载与安装(非常详细,一步不落!!!) Java jdk11 在Mac上的安装和配置以及JDK多个版本之间切换 打包成可运行的springboot jar 打包成普通jar maven-compiler-plugin 与 spring-boot-maven-plugin 区别: maven-compile

    2024年02月11日
    浏览(33)
  • 【SpringBoot】SpringBoot2.x知识点杂记

    本文仅供学习交流使用 为什么要使用 Spring Boot 因为Spring, SpringMVC 需要使用的大量的配置文件 (xml文件) 还需要配置各种对象,把使用的对象放入到spring容器中才能使用对象 需要了解其他框架配置规则。 SpringBoot 就相当于 不需要配置文件的Spring+SpringMVC。 常用的框架和第三

    2024年02月03日
    浏览(46)
  • SpringBoot2.0(Lombok,SpringBoot统一返回封装)

    ​ java工程中,我们要创建很多的java Bean。这些javaBean中都会写getter,setter,equals,hashCode和toString的模板代码,这些代码都没啥技术含量。 ​ 那么我们就是使用Lombok来自动生成这些代码,通过注解的方式。提高我们的工作效率。 ​ Lombok的原理:JSR 269插件化注解处理。就是在

    2024年02月09日
    浏览(36)
  • 1、Springboot2简介

    在学习 SpringBoot 之前,建议先具备 SpringMVC(控制层)、Spring(业务层)和 Mybatis(持久层)的相关知识 Spring 框架虽然很出色,但是有一个明显的缺点:配置文件过于繁琐和复杂; 在单体项目中,因为配置文件只需要编写一遍即可,所以该缺点只是一个小问题; 在微服务项目

    2024年02月05日
    浏览(36)
  • SpringBoot2-核心技术(一)

    1. properties 同以前的用法 2. yaml YAML : “YAML Ain‘t Markup Language ”(yaml 不是一种递归标记语言) 的递归缩写, 在开发这种语言时,YAML 的意思是:Yet Another Markup Language (仍是一种标记语言) 非常适合用来做以数据为中心的配置文件 1. 基本语法 key: value ; value与: 之间存在空格

    2024年02月07日
    浏览(39)
  • 如何将Springboot项目升级成Springcloud项目(有图详解)

    本文以nacos为例 分为以下几个步骤 1. 下载nacos软件 2. pom文件配置 3. application.yml文件配置 4. 代码调用 5. 效果展示 1.1 下载nacos-server-2.2.0-BETA这个版本 nacos-server-2.2.0-BETA 1.2 修改nacos配置文件 打开bin目录下的startup.cmd,将第26行的 set MODE=“cluster” 改为: set MODE=“standalone” 1.3 双

    2024年02月14日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包