springboot自動裝配TypeNotPresentExceptionProxy異常排查解決
前言
正文開始前,我們做個小測試,假設我們封裝了一個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或者以上版本,再運行
項目成功運行。那我們的修復的第一直覺是不是把JDK8的版本提高。
我們團隊的小伙伴第一時間也是這么干的,他去和業(yè)務團隊的技術(shù)經(jīng)理溝通,看他們能不能把JDK8調(diào)整成JDK11,然后得到了業(yè)務團隊技術(shù)經(jīng)理的高度否定,因為他們大部分業(yè)務都跑在jdk8,冒然升級成jdk11,也不知道會不會因為了解決一個問題,而引入其他問題
問題排查
因為這個starter的自動裝配配置的內(nèi)容相對簡單,基于老司機的第六感,問題大概率是出現(xiàn)在@ConditionalOnClass這注解上,于是點開@ConditionalOnClass,他的注解上有如下提示
他的大意是,可以在@Configuration classes上安全地指定value(),因為在加載類之前會使用ASM解析注釋元數(shù)據(jù)。當放置在@Bean方法上時,需要格外小心,請考慮在單獨的Configuration類中隔離條件,特別是當方法的返回類型與條件的目標匹配時。如果非要用方法注解,建議使用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注解,強烈建議使用name屬性,而不要用value屬性。其次如果有提供組件給其他業(yè)務團隊使用,要特別關注版本問題,以及做好向下兼容,不然指不定又掉坑了。
以上就是springboot自動裝配TypeNotPresentExceptionProxy異常排查解決的詳細內(nèi)容,更多關于springboot TypeNotPresentExceptionProxy的資料請關注腳本之家其它相關文章!
相關文章
Java 8對LinkedHashSet元素進行排序的操作方法
LinkedHashSet 是 Java 集合框架中的一個類,它繼承自 HashSet,并實現(xiàn)了 Set 接口,然而,LinkedHashSet 不支持元素的排序,它僅僅保持插入順序,所以本文給大家介紹了Java 8 如何對 LinkedHashSet 元素進行排序,需要的朋友可以參考下2024-11-11Java中Controller、Service、Dao/Mapper層的區(qū)別與用法
在Java開發(fā)中,通常會采用三層架構(gòu)(或稱MVC架構(gòu))來劃分程序的職責和功能,分別是Controller層、Service層、Dao/Mapper層,本文將詳細給大家介紹了三層的區(qū)別和用法,需要的朋友可以參考下2023-05-05SpringCloud之LoadBalancer負載均衡服務調(diào)用過程
這篇文章主要介紹了SpringCloud之LoadBalancer負載均衡服務調(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)進行,數(shù)據(jù)可以直接通過HttpServletRequest共享,需要的朋友可以參考下2022-07-07