问题场景
使用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"})
结果
问题解决,程序也正常跑起来了。
总结
看清楚具体的问题,如果可以追踪到源码,就可以直接了解到出错的具体原因。然后针对具体问题进行解决。
随缘求赞
如果我的文章对大家产生了帮忙,可以在文章底部点个赞或者收藏;
如果有好的讨论,可以留言;
如果想继续查看我以后的文章,可以左上角点击关注