springboot自動(dòng)裝配TypeNotPresentExceptionProxy異常排查解決
前言
正文開始前,我們做個(gè)小測(cè)試,假設(shè)我們封裝了一個(gè)springboot starter,其自動(dòng)裝配類形如下內(nèi)容
@Configuration @EnableConfigurationProperties({ApolloRefreshProperties.class}) public class ApolloRefreshAutoConfiguration { @Bean @ConditionalOnMissingBean @ConditionalOnClass({ConfigService.class}) public ApolloRefreshService apolloRefreshService(ApolloRefreshProperties properties) { return new ApolloRefreshService(properties); } }
該starter的pom引入的apollo gav是optional
<dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>${apollo-client.version}</version> <optional>true</optional> </dependency>
我的問(wèn)題是
在運(yùn)行環(huán)境為jdk8的springboot項(xiàng)目引入上述的starter,是否會(huì)有問(wèn)題?
我們運(yùn)行一下,發(fā)現(xiàn)會(huì)出現(xiàn)
然后我們不改任何一行代碼,把JDK調(diào)成11或者以上版本,再運(yùn)行
項(xiàng)目成功運(yùn)行。那我們的修復(fù)的第一直覺是不是把JDK8的版本提高。
我們團(tuán)隊(duì)的小伙伴第一時(shí)間也是這么干的,他去和業(yè)務(wù)團(tuán)隊(duì)的技術(shù)經(jīng)理溝通,看他們能不能把JDK8調(diào)整成JDK11,然后得到了業(yè)務(wù)團(tuán)隊(duì)技術(shù)經(jīng)理的高度否定,因?yàn)樗麄兇蟛糠謽I(yè)務(wù)都跑在jdk8,冒然升級(jí)成jdk11,也不知道會(huì)不會(huì)因?yàn)榱私鉀Q一個(gè)問(wèn)題,而引入其他問(wèn)題
問(wèn)題排查
因?yàn)檫@個(gè)starter的自動(dòng)裝配配置的內(nèi)容相對(duì)簡(jiǎn)單,基于老司機(jī)的第六感,問(wèn)題大概率是出現(xiàn)在@ConditionalOnClass這注解上,于是點(diǎn)開@ConditionalOnClass,他的注解上有如下提示
他的大意是,可以在@Configuration classes上安全地指定value(),因?yàn)樵诩虞d類之前會(huì)使用ASM解析注釋元數(shù)據(jù)。當(dāng)放置在@Bean方法上時(shí),需要格外小心,請(qǐng)考慮在單獨(dú)的Configuration類中隔離條件,特別是當(dāng)方法的返回類型與條件的目標(biāo)匹配時(shí)。如果非要用方法注解,建議使用ConditionalOnClass里面的name字段
于是我們聽官方的建議,將starter調(diào)整如下
@Configuration @EnableConfigurationProperties({ApolloRefreshProperties.class}) public class ApolloRefreshAutoConfiguration { @Bean @ConditionalOnMissingBean @ConditionalOnClass(name = "com.ctrip.framework.apollo.ConfigService") public ApolloRefreshService apolloRefreshService(ApolloRefreshProperties properties) { return new ApolloRefreshService(properties); } }
再次運(yùn)行,果然不再報(bào)錯(cuò)。具體問(wèn)題原因,我就不班門弄斧了,可以查看官方的issue
https://github.com/spring-projects/spring-boot/issues/27846
https://github.com/spring-projects/spring-boot/issues/17282
總結(jié)
首先如果用 @ConditionalOnClass注解,強(qiáng)烈建議使用name屬性,而不要用value屬性。其次如果有提供組件給其他業(yè)務(wù)團(tuán)隊(duì)使用,要特別關(guān)注版本問(wèn)題,以及做好向下兼容,不然指不定又掉坑了。
以上就是springboot自動(dòng)裝配TypeNotPresentExceptionProxy異常排查解決的詳細(xì)內(nèi)容,更多關(guān)于springboot TypeNotPresentExceptionProxy的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MyBatis二級(jí)緩存實(shí)現(xiàn)關(guān)聯(lián)刷新
本文主要介紹了MyBatis二級(jí)緩存實(shí)現(xiàn)關(guān)聯(lián)刷新,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01Java 8對(duì)LinkedHashSet元素進(jìn)行排序的操作方法
LinkedHashSet 是 Java 集合框架中的一個(gè)類,它繼承自 HashSet,并實(shí)現(xiàn)了 Set 接口,然而,LinkedHashSet 不支持元素的排序,它僅僅保持插入順序,所以本文給大家介紹了Java 8 如何對(duì) LinkedHashSet 元素進(jìn)行排序,需要的朋友可以參考下2024-11-11Java中Controller、Service、Dao/Mapper層的區(qū)別與用法
在Java開發(fā)中,通常會(huì)采用三層架構(gòu)(或稱MVC架構(gòu))來(lái)劃分程序的職責(zé)和功能,分別是Controller層、Service層、Dao/Mapper層,本文將詳細(xì)給大家介紹了三層的區(qū)別和用法,需要的朋友可以參考下2023-05-05SpringCloud之LoadBalancer負(fù)載均衡服務(wù)調(diào)用過(guò)程
這篇文章主要介紹了SpringCloud之LoadBalancer負(fù)載均衡服務(wù)調(diào)用過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03java 后臺(tái)將base64字符串保存為圖片的方法
本篇文章主要介紹了java 后臺(tái)將base64字符串保存為圖片的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09SpringMVC轉(zhuǎn)發(fā)與重定向參數(shù)傳遞的實(shí)現(xiàn)詳解
這篇文章主要介紹了SpringMVC轉(zhuǎn)發(fā)與重定向參數(shù)傳遞,對(duì)于重定向,可以通過(guò)FlashMap或RedirectAttributes來(lái)在請(qǐng)求間傳遞數(shù)據(jù),因?yàn)橹囟ㄏ蛏婕皟蓚€(gè)獨(dú)立的HTTP請(qǐng)求,而轉(zhuǎn)發(fā)則在同一請(qǐng)求內(nèi)進(jìn)行,數(shù)據(jù)可以直接通過(guò)HttpServletRequest共享,需要的朋友可以參考下2022-07-07