问题解决: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"})

结果

问题解决,程序也正常跑起来了。

总结

看清楚具体的问题,如果可以追踪到源码,就可以直接了解到出错的具体原因。然后针对具体问题进行解决。

随缘求赞

如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏;
如果有好的讨论,可以留言;
如果想继续查看我以后的文章,可以左上角点击关注

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