今天遇到了一個錯誤,通常的錯誤提示會很明顯,一看就知道是什麼問題。今天遇到的這個說實話真的很差找緣由,通常在這種狀況下該怎麼解決呢?java
分享下個人思路吧,不必定是最好的,至少有用。web
直接上圖吧,下面是報錯信息:spring
爲了方便查看,我把最重要的信息提取出來,以下:數組
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這個確實平時不多遇到,看了下源碼,這個是數組存儲異常。好比下圖中我框起來的部分就清楚的表示了在什麼場景下會出現這個異常。app
也就是在存儲的時候類型不一致,而後就報錯了唄!spa
第二個須要關注的錯誤信息是WebAppConfigurer.class,這個還算挺明確的,告訴我哪一個類有問題,而後我看了下對應的代碼,也就手動的映射了資源路徑而已。debug
因而我就想,是否是這裏面哪一個類加載的時候出問題了,我把WebAppConfigurer直接去掉了,可是並沒什麼用,後面仍是報的相同的錯誤,只不過是提示另外一個類了,就是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
因此說這些錯誤信息沒能直接定位問題就是這個緣由,咱們要關注的仍是java.lang.ArrayStoreException這個異常,只要找到這個異常發生的地方就能解決了。code
下面只能藉助於IDEA強大的調試功能了,增長一個Java Exception Breakpoints了。blog
而後debug模式重啓,果不其然就報錯的時候就進斷點了。
這下終於找到緣由了,parseClassValue的時候出問題了,Class就是 org.springframework.cloud.sleuth.instrument.web.client.feign.TraceFeignClientAutoConfiguration。
這個類是我當時在Sleuth中擴展Sentinel對Feign支持的時候作了一些修改,沒想到竟然出了Bug。
下面給你們說明下真正的緣由吧,在這個擴展模塊中sentinel的依賴是可選的,以下:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-sentinel</artifactId> <optional>true</optional> </dependency>
恰好報錯的項目中不須要用到Sentinel,可是用到了Sleuth和Feign,因此TraceFeignClientAutoConfiguration生效了。主要仍是Conditional都知足條件了。
項目中又沒顯示指定依賴Sentinel,這個類天然加載失敗。
因此解決辦法就是要麼加Sentinel依賴,要麼就是在@ConditionalOnClass中加上Sentinel的類,這樣只有當在Sentinel的類在classpath中存在的時候纔會加載,若是項目沒依賴Sentinel那麼就不加載,這樣就沒問題了。
最後總結下吧,主要仍是要找到真正問題發生在什麼地方,有的時候異常信息給出的並不必定是真正的地方,只是有關聯而已。
當你封裝的模塊設置了optional=true的時候,在對應的配置類加載生效也須要用@ConditionalOnClass來進行判斷啓用,不然就會出現上面的問題。