springboot自動裝配TypeNotPresentExceptionProxy異常排查解決
前言
正文開始前,我們做個小測試,假設(shè)我們封裝了一個springboot starter,其自動裝配類形如下內(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>
我的問題是
在運行環(huán)境為jdk8的springboot項目引入上述的starter,是否會有問題?
我們運行一下,發(fā)現(xiàn)會出現(xiàn)
然后我們不改任何一行代碼,把JDK調(diào)成11或者以上版本,再運行
項目成功運行。那我們的修復(fù)的第一直覺是不是把JDK8的版本提高。
我們團(tuán)隊的小伙伴第一時間也是這么干的,他去和業(yè)務(wù)團(tuán)隊的技術(shù)經(jīng)理溝通,看他們能不能把JDK8調(diào)整成JDK11,然后得到了業(yè)務(wù)團(tuán)隊技術(shù)經(jīng)理的高度否定,因為他們大部分業(yè)務(wù)都跑在jdk8,冒然升級成jdk11,也不知道會不會因為了解決一個問題,而引入其他問題
問題排查
因為這個starter的自動裝配配置的內(nèi)容相對簡單,基于老司機(jī)的第六感,問題大概率是出現(xiàn)在@ConditionalOnClass這注解上,于是點開@ConditionalOnClass,他的注解上有如下提示
他的大意是,可以在@Configuration classes上安全地指定value(),因為在加載類之前會使用ASM解析注釋元數(shù)據(jù)。當(dāng)放置在@Bean方法上時,需要格外小心,請考慮在單獨的Configuration類中隔離條件,特別是當(dāng)方法的返回類型與條件的目標(biāo)匹配時。如果非要用方法注解,建議使用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); } }
再次運行,果然不再報錯。具體問題原因,我就不班門弄斧了,可以查看官方的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)隊使用,要特別關(guān)注版本問題,以及做好向下兼容,不然指不定又掉坑了。
以上就是springboot自動裝配TypeNotPresentExceptionProxy異常排查解決的詳細(xì)內(nèi)容,更多關(guān)于springboot TypeNotPresentExceptionProxy的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MyBatis二級緩存實現(xiàn)關(guān)聯(lián)刷新
本文主要介紹了MyBatis二級緩存實現(xiàn)關(guān)聯(lián)刷新,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01Java 8對LinkedHashSet元素進(jìn)行排序的操作方法
LinkedHashSet 是 Java 集合框架中的一個類,它繼承自 HashSet,并實現(xiàn)了 Set 接口,然而,LinkedHashSet 不支持元素的排序,它僅僅保持插入順序,所以本文給大家介紹了Java 8 如何對 LinkedHashSet 元素進(jìn)行排序,需要的朋友可以參考下2024-11-11Java中Controller、Service、Dao/Mapper層的區(qū)別與用法
在Java開發(fā)中,通常會采用三層架構(gòu)(或稱MVC架構(gòu))來劃分程序的職責(zé)和功能,分別是Controller層、Service層、Dao/Mapper層,本文將詳細(xì)給大家介紹了三層的區(qū)別和用法,需要的朋友可以參考下2023-05-05SpringCloud之LoadBalancer負(fù)載均衡服務(wù)調(diào)用過程
這篇文章主要介紹了SpringCloud之LoadBalancer負(fù)載均衡服務(wù)調(diào)用過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03SpringMVC轉(zhuǎn)發(fā)與重定向參數(shù)傳遞的實現(xiàn)詳解
這篇文章主要介紹了SpringMVC轉(zhuǎn)發(fā)與重定向參數(shù)傳遞,對于重定向,可以通過FlashMap或RedirectAttributes來在請求間傳遞數(shù)據(jù),因為重定向涉及兩個獨立的HTTP請求,而轉(zhuǎn)發(fā)則在同一請求內(nèi)進(jìn)行,數(shù)據(jù)可以直接通過HttpServletRequest共享,需要的朋友可以參考下2022-07-07