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的版本提高。
我們團隊的小伙伴第一時間也是這么干的,他去和業(yè)務(wù)團隊的技術(shù)經(jīng)理溝通,看他們能不能把JDK8調(diào)整成JDK11,然后得到了業(yè)務(wù)團隊技術(shù)經(jīng)理的高度否定,因為他們大部分業(yè)務(wù)都跑在jdk8,冒然升級成jdk11,也不知道會不會因為了解決一個問題,而引入其他問題
問題排查
因為這個starter的自動裝配配置的內(nèi)容相對簡單,基于老司機的第六感,問題大概率是出現(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注解,強烈建議使用name屬性,而不要用value屬性。其次如果有提供組件給其他業(yè)務(wù)團隊使用,要特別關(guān)注版本問題,以及做好向下兼容,不然指不定又掉坑了。
以上就是springboot自動裝配TypeNotPresentExceptionProxy異常排查解決的詳細(xì)內(nèi)容,更多關(guān)于springboot TypeNotPresentExceptionProxy的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
javax.management.InvalidApplicationException的問題解決
javax.management.InvalidApplicationException是與Java Management Extensions (JMX) API相關(guān)的一個常見異常,本文主要介紹了javax.management.InvalidApplicationException的問題解決,感興趣的可以了解一下2024-08-08
使用Java DOM解析器修改XML文件內(nèi)容的操作方法
在Java中,XML文件的解析和修改可以通過多種方法實現(xiàn),其中DOM(Document Object Model)是一種常用的方式,在本文中,我們將介紹如何使用Java DOM解析器修改XML文件中的內(nèi)容,并給出一個具體的示例,需要的朋友可以參考下2024-08-08
SpringBoot整合Shiro靜態(tài)資源攔截配置實踐
本文介紹了Spring?Boot整合Thymeleaf訪問resources目錄下static靜態(tài)資源的方法,并提供三種解決方式,方法一通過修改訪問路徑,方法二在yml文件中修改配置,方法三通過創(chuàng)建statics目錄并調(diào)整攔截配置來實現(xiàn)2026-05-05

