Springboot項(xiàng)目升級(jí)2.2.x升至2.7.x的示例代碼
依賴(lài)管理
spring-boot-starter-parent 升級(jí)為2.7.1
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!-- 升級(jí)為2.7.x的版本-->
<version>2.7.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>兼容老的配置文件格式,spring提供了專(zhuān)門(mén)的依賴(lài)進(jìn)行兼容,但是建議還是在升級(jí)能成功運(yùn)行之后進(jìn)行配置的同步修改
<!-- 升級(jí)2.7后支持yml環(huán)境變量名兼容-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<scope>runtime</scope>
</dependency>如果使用了bootstrap.yml文件,升級(jí)之后默認(rèn)是不會(huì)使用bootstrap.yml了,所以可能會(huì)導(dǎo)致啟動(dòng)之后配置沒(méi)有生效,需要引入依賴(lài)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.4</version>
</dependency>配置修改
2.7.x不會(huì)處理循環(huán)依賴(lài)問(wèn)題,需要手動(dòng)配置修改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>同時(shí)需要支持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} #配置中心報(bào)錯(cuò)問(wèn)題定位思路
啟動(dòng)報(bào)錯(cuò):
Web application could not be started as there was no org.springframework.boot.web.servlet.server.ServletWebServerFactory bean defined in the context.
最開(kāi)始搜索報(bào)錯(cuò),很多網(wǎng)上說(shuō)的一般都是忘記加注解 @SpringBootApplication ,或者沒(méi)有引入依賴(lài):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>但是檢查并沒(méi)有遺漏。開(kāi)始根據(jù)問(wèn)題本身進(jìn)行定位。
報(bào)錯(cuò)本身就是沒(méi)有找到ServletWebServerFactory,那么思路就是檢查xxxxxxxConfiguration中的代碼是否正常執(zhí)行,這里就是 org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration
因?yàn)槭荰omcat方式啟動(dòng)所以只需要關(guān)心 tomcatServletWebServerFactory 方法

這里我設(shè)置了debug的方式但是并沒(méi)有走到這里
再次全局搜索懷疑可能是自動(dòng)裝配的類(lèi) org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration 有問(wèn)題


再次嘗試debug發(fā)現(xiàn)依然沒(méi)有走到,繼續(xù)思考查看類(lèi)上方相關(guān)的Conditional注解條件是否滿足,猜測(cè)可能是 @ConditionalOnWebApplication(type = Type.SERVLET) 不滿足
點(diǎn)進(jìn)注解查看

繼續(xù)查看對(duì)應(yīng)的 org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition ,搜索剛才的相關(guān)的 SERVLET ,繼續(xù)debug發(fā)現(xiàn)type為null直接返回了

繼續(xù)查找調(diào)用的地方進(jìn)行debug發(fā)現(xiàn) autoConfigurationMetadata 傳入的就有問(wèn)題,很多value都是空字符串

繼續(xù)定位到上級(jí)調(diào)用,發(fā)現(xiàn)傳入的數(shù)據(jù)依然和上面一樣存在問(wèn)題

繼續(xù)跟蹤定位,終于調(diào)到了我們自己寫(xiě)的代碼了

繼續(xù)查看上級(jí)調(diào)用,發(fā)現(xiàn)這個(gè)類(lèi)是我們自己拷貝出來(lái)的Springboot內(nèi)部的類(lèi),做了一些自定義的改造

這里就說(shuō)明,可能是從低版本的Springboot中拷貝出來(lái)的,但是升級(jí)到2.7.x之后可能存在對(duì)應(yīng)的邏輯變化,所以需要對(duì)比一下,大概是哪些代碼不一致

Ctrl+A全選Ctrl+C復(fù)制我們自己寫(xiě)的代碼,然后跳進(jìn)內(nèi)部的 AutoConfigurationImportSelector 再進(jìn)行比較


這里發(fā)現(xiàn)我們自己的代碼少了一行
ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader()).forEach(configurations::add);
根據(jù)斷言可以知道對(duì)應(yīng)的這段代碼不僅是讀取了 META-INF/spring.factories 中的自動(dòng)裝配信息,還讀取了 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 中的自動(dòng)裝配的bean

最后查看了包結(jié)構(gòu),確實(shí)如此,升級(jí)后 META-INF/spring.factories 沒(méi)有了 ServletWebServerFactoryAutoConfiguration 而是放到了 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 中。最后解決就是復(fù)制對(duì)應(yīng)的代碼到自定義的類(lèi)中,支持 imports 中的自動(dòng)裝配
到此這篇關(guān)于Springboot項(xiàng)目升級(jí)2.2.x升至2.7.x的示例代碼的文章就介紹到這了,更多相關(guān)Springboot 升級(jí)2.2.x升至2.7.x內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java web實(shí)現(xiàn)郵箱激活與忘記密碼
這篇文章主要為大家詳細(xì)介紹了java web實(shí)現(xiàn)郵箱激活與忘記密碼、重置密碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):單鏈表與雙向鏈表
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)單鏈表、雙向鏈表的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
使用profiles進(jìn)行多環(huán)境配置的代碼實(shí)現(xiàn)
在項(xiàng)目開(kāi)發(fā)的過(guò)程中會(huì)用到多個(gè)環(huán)境,為了便于開(kāi)發(fā)使用,通常需要使用profiles進(jìn)行多環(huán)境配置,所以本文給大家介紹了使用profiles進(jìn)行多環(huán)境配置的代碼實(shí)現(xiàn),需要的朋友可以參考下2024-02-02
Spring Boot集成Redis實(shí)戰(zhàn)操作功能
這篇文章主要介紹了Spring Boot集成Redis實(shí)戰(zhàn)操作,包括如何集成redis以及redis的一些優(yōu)點(diǎn),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11
Windows下將JAVA?jar注冊(cè)成windows服務(wù)的方法
這篇文章主要介紹了Windows下將JAVA?jar注冊(cè)成windows服務(wù)的方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
利用SpringBoot與WebSocket實(shí)現(xiàn)實(shí)時(shí)雙向通信功能
隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,實(shí)時(shí)通信技術(shù)已經(jīng)逐漸成為現(xiàn)代Web應(yīng)用的核心需求,論是在即時(shí)消息系統(tǒng)還是物聯(lián)網(wǎng)(IoT)應(yīng)用中,WebSocket都提供了一種高效、持久的雙向通信方式,本文將深入解析如何利用Spring Boot實(shí)現(xiàn)WebSocket通信,需要的朋友可以參考下2025-07-07
從基礎(chǔ)到實(shí)戰(zhàn)詳解SpringBoot3實(shí)現(xiàn)分頁(yè)操作的完整指南
在當(dāng)今的互聯(lián)網(wǎng)軟件開(kāi)發(fā)領(lǐng)域,處理海量數(shù)據(jù)是一個(gè)繞不開(kāi)的話題,這篇文章jiang深入探討在 Spring Boot3 中如何巧妙實(shí)現(xiàn)分頁(yè)操作,下面我們就來(lái)詳細(xì)介紹一下吧2025-12-12
Java實(shí)現(xiàn)簡(jiǎn)單臺(tái)球游戲
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單臺(tái)球游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07

