問題解決:java.lang.ExceptionInInitializerError 因變量未注入就使用導致的報錯

問題場景

使用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"})

結果

問題解決,程序也正常跑起來了。

總結

看清楚具體的問題,如果可以追蹤到源碼,就可以直接瞭解到出錯的具體原因。然後針對具體問題進行解決。

隨緣求贊

如果我的文章對大家產生了幫忙,可以在文章底部點個贊或者收藏;
如果有好的討論,可以留言;
如果想繼續查看我以後的文章,可以左上角點擊關注

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章