新聞中心
今天遇到了一個(gè)錯(cuò)誤,一般的錯(cuò)誤提示會(huì)很明顯,一看就知道是什么問題。今天遇到的這個(gè)說實(shí)話真的不好找原因,一般在這種情況下該怎么解決呢?

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),虹口企業(yè)網(wǎng)站建設(shè),虹口品牌網(wǎng)站建設(shè),網(wǎng)站定制,虹口網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,虹口網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
分享下我的思路吧,不一定是最好的,至少有用。
直接上圖吧,下面是報(bào)錯(cuò)信息:
為了方便查看,我把最重要的信息提取出來,如下:
- org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [com/cxytiandi/kitty/web/config/WebAppConfigurer.class]: Invocation of init method failed; nested exception is java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
java.lang.ArrayStoreException這個(gè)確實(shí)平時(shí)很少遇到,看了下源碼,這個(gè)是數(shù)組存儲(chǔ)異常。比如下圖中我框起來的部分就清楚的表示了在什么場景下會(huì)出現(xiàn)這個(gè)異常。
也就是在存儲(chǔ)的時(shí)候類型不一致,然后就報(bào)錯(cuò)了唄!
第二個(gè)需要關(guān)注的錯(cuò)誤信息是WebAppConfigurer.class,這個(gè)還算挺明確的,告訴我哪個(gè)類有問題,然后我看了下對(duì)應(yīng)的代碼,也就手動(dòng)的映射了資源路徑而已。
于是我就想,是不是這里面哪個(gè)類加載的時(shí)候出問題了,我把WebAppConfigurer直接去掉了,但是并沒什么用,后面還是報(bào)的相同的錯(cuò)誤,只不過是提示另一個(gè)類了,就是WebMvcAutoConfiguration。
- [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
所以說這些錯(cuò)誤信息沒能直接定位問題就是這個(gè)原因,我們要關(guān)注的還是java.lang.ArrayStoreException這個(gè)異常,只要找到這個(gè)異常發(fā)生的地方就能解決了。
下面只能借助于IDEA強(qiáng)大的調(diào)試功能了,增加一個(gè)Java Exception Breakpoints了。
然后debug模式重啟,果不其然就報(bào)錯(cuò)的時(shí)候就進(jìn)斷點(diǎn)了。
這下終于找到原因了,parseClassValue的時(shí)候出問題了,Class就是 org.springframework.cloud.sleuth.instrument.web.client.feign.TraceFeignClientAutoConfiguration。
這個(gè)類是我當(dāng)時(shí)在Sleuth中擴(kuò)展Sentinel對(duì)Feign支持的時(shí)候做了一些修改,沒想到居然出了Bug。
下面給大家說明下真正的原因吧,在這個(gè)擴(kuò)展模塊中sentinel的依賴是可選的,如下:
com.alibaba.cloud spring-cloud-alibaba-sentinel true
剛好報(bào)錯(cuò)的項(xiàng)目中不需要用到Sentinel,但是用到了Sleuth和Feign,所以TraceFeignClientAutoConfiguration生效了。主要還是Conditional都滿足條件了。
項(xiàng)目中又沒顯示指定依賴Sentinel,這個(gè)類自然加載失敗。
所以解決辦法就是要么加Sentinel依賴,要么就是在@ConditionalOnClass中加上Sentinel的類,這樣只有當(dāng)在Sentinel的類在classpath中存在的時(shí)候才會(huì)加載,如果項(xiàng)目沒依賴Sentinel那么就不加載,這樣就沒問題了。
最后總結(jié)下吧,主要還是要找到真正問題發(fā)生在什么地方,有的時(shí)候異常信息給出的并不一定是真正的地方,只是有關(guān)聯(lián)而已。
當(dāng)你封裝的模塊設(shè)置了optional=true的時(shí)候,在對(duì)應(yīng)的配置類加載生效也需要用@ConditionalOnClass來進(jìn)行判斷啟用,否則就會(huì)出現(xiàn)上面的問題。
新聞標(biāo)題:必殺技:當(dāng)報(bào)錯(cuò)信息看不出原因時(shí),怎么辦?
鏈接分享:http://www.dlmjj.cn/article/ccspocp.html


咨詢
建站咨詢
