問題場景
使用springCloud
微服務框架,自己的一個微服務項目在啓動過程報錯。報錯提示如下:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'MQConsumerService' defined in URL [jar:file:/data/data-collection/mircroservices/service-data-collection-clean-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/mq/MQConsumerService.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanExpressionException: Expression parsing failed; nested exception is java.lang.ExceptionInInitializerError
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1251)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1171)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593)
Caused by: java.lang.NullPointerException: null
at com.ctt.common.util.Language.getLanguage(Language.java:38)
at com.ctt.common.util.YmlConfigUtil.getProperty(YmlConfigUtil.java:58)
at com.ctt.common.util.SysConfig.getProperty(SysConfig.java:36)
at com.ctt.bigdata.demo.data_collection_parent.util.HostUtil.getNowIPOrAppointIP(HostUtil.java:20)
at com.ctt.bigdata.demo.data_collection_parent.data.constancy.HostInfoConst.<clinit>(HostInfoConst.java:16)
... 60 common frames omitted
問題環境
軟件 | 版本 |
---|---|
spring-boot | 2.1.8.RELEASE |
JDK | 1.8 |
問題原因
這個需要深入到源碼查看。從下面截圖代碼可以看到,報錯行數是第38行,是env
爲空,導致空指針異常。而env
變量屬於外部注入的靜態變量,在調用的時候,該變量還未初始化成功。所以,這裏就可以知道,就是因爲程序在該變量還未被初始化的時候,就調用了該方法,導致了報錯。
解決方案
既然是在程序未初始化好變量就調用該變量的方法,那很顯然,我們設定當使用該變量的時候,要先初始化該變量。接下來就是重點了,spring
官方提供了註解DependOn
,可以用於變量初始化的。讓我們看看官方解釋:
對應的中文解釋如下:
基於當前bean所依賴的bean。確保所有指定的bean都由該bean之前的容器創建。在不通過屬性或構造函數參數顯式依賴另一個Bean而是依賴於另一個Bean初始化的副作用的情況下,不經常使用。
DependOn
聲明既可以指定初始化時間依賴性,也可以僅在單例bean的情況下指定相應的銷燬時間依賴性。定義與給定bean的依賴關係的從屬bean首先被銷燬,然後再銷燬給定bean本身。因此,依賴聲明也可以控制關閉順序。
可以在直接或間接用Component註釋的任何類上或用Bean註釋的方法上使用。除非使用組件掃描,否則在類級別使用DependsOn無效。如果通過XML聲明瞭DependsOn註釋的類,則DependsOn註釋元數據將被忽略,而將改爲使用<beanDepends-on =“ …” />。
因此,我們在調用在方法的類加上註解DependOn
就可以解決該問題,如下:
@DependsOn({"configUtil"})
結果
問題解決,程序也正常跑起來了。
總結
看清楚具體的問題,如果可以追蹤到源碼,就可以直接瞭解到出錯的具體原因。然後針對具體問題進行解決。
隨緣求贊
如果我的文章對大家產生了幫忙,可以在文章底部點個贊或者收藏;
如果有好的討論,可以留言;
如果想繼續查看我以後的文章,可以左上角點擊關注