Java Spring中创建bean期间的NullPointerException
我在一个带有注释Java Spring中创建bean期间的NullPointerException,java,spring,nullpointerexception,Java,Spring,Nullpointerexception,我在一个带有注释@Bean的方法中收到一个NullPointerException,但在此之前,我从未在那里得到过这个NullPointerException: Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [dev.teamnight.command.CommandFramework]: Circular reference involving containing
@Bean
的方法中收到一个NullPointerException,但在此之前,我从未在那里得到过这个NullPointerException:
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [dev.teamnight.command.CommandFramework]: Circular reference involving containing bean 'config' - consider declaring the factory method as static for independence from its containing instance. Factory method 'commandFramework' threw exception; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:651) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
... 68 common frames omitted
Caused by: java.lang.NullPointerException: null
at dev.teamnight.nightbot.Config.commandFramework(Config.java:84) ~[classes/:na]
at dev.teamnight.nightbot.Config$$EnhancerBySpringCGLIB$$2d4937ec.CGLIB$commandFramework$3(<generated>) ~[classes/:na]
at dev.teamnight.nightbot.Config$$EnhancerBySpringCGLIB$$2d4937ec$$FastClassBySpringCGLIB$$3fbdfefd.invoke(<generated>) ~[classes/:na]
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[spring-context-5.2.6.RELEASE.jar:5.2.6.RELEASE]
at dev.teamnight.nightbot.Config$$EnhancerBySpringCGLIB$$2d4937ec.commandFramework(<generated>) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.2.6.RELEASE.jar:5.2.6.RELEASE]
... 69 common frames omitted
正如我所说,在代码完全工作之前,我没有对Config.java文件做任何更改,因此这个错误让我非常困惑。您看到的是
NullPointerException
,因为autowiredHelperProvider
没有被注入
您正试图对空对象调用.getClass()
通用依赖注入调试
只想添加一个快速的基本内容,因为这个问题的主要答案必须对您的代码库做出一些假设。当依赖项注入失败时,有几件事需要检查
组件
是否具有必要的@组件
和/或@Service/@Controller/@Repository
注释<代码>:Orr.SrrgFraskWork.BeANS.BeaStistAutoExcExc:包含bean 'CONFIG的循环引用——考虑将工厂方法声明为独立于其包含实例的静态方法。工厂方法“commandFramework”引发异常;嵌套异常是java.lang.NullPointerException
由于收到此错误消息,您引入了循环引用。这意味着。。。组件依赖于依赖于该组件的组件 例如:@Component
class HelperProvider {
@Autowired
Config config;
}
及
这种模式将阻碍spring框架,因为它们相互依赖来加载每个组件。如果进一步引入依赖项,就会发生这种情况。假设HelperProvider需要HelperHelperProvider,它需要配置
您需要在最近的编辑中检查Config
或CommandFramework
的任何新注入
你该怎么办
您需要重新设计配置,以打破它对HelperProvider
的依赖。这样做可以解决你未来的许多难题
你不应该做什么
可以使用
@Lazy
注释懒散地加载组件或配置。这样,bean仅在调用时实例化。如果您想在启动SpringApplicationContext时了解更多细微差别,建议您这样做,但在以后的过程中维护它将成为一场噩梦。您遇到的错误很可能是因为您的项目中存在循环依赖关系。由于您是在commandFramework方法中获得它的,如错误中所示,这是因为您在HelpProvider类中再次使用Config类
因此,当spring创建一个配置bean时,它必须创建一个HelpProvider bean,这就意味着要创建一个配置bean(HelpProvider中的自动连接),并导致一个永无止境的循环,给出错误。还要检查HelpProvider是否具有@component注释
配置->帮助提供者->配置->帮助提供者->配置
解决方案:-
您可以从HelpProvider中删除配置并尝试重新设计它
在HelpProvider中使用@Lazy on Config,它将在对象实例化时加载此依赖项。将建议将其作为最后手段
在那里放置一个断点,并检查那里的值是否为空。@szatkus this.helpProvider为空null@Nightloewe根据您提供的信息,我做了一些假设来回答您的问题。stacktrace,您没有接触Config
类的事实。我建议您查看提交日志,看看Config
是否已自动连接到任何新位置,或者CommandFramework也是可能的罪魁祸首。这非常奇怪,看起来应该可以正常工作。我将注意到,通常最好将依赖项作为方法参数而不是字段注入,这可能会解决(或澄清)问题。删除自动连线的shardManager
,而不是this.shardManager
dothis.shardManager()
。改为调用该方法。这将解决配置和CommandFramework
的即时初始化问题,并删除循环依赖项。根据经验,不要在同时创建bean的类中自动连接bean(这将导致以后的问题)。我检查了我的提交,发现我将CommandFramework作为依赖项添加到了ShardManager使用的JDA侦听器中。CommandFramework需要创建shardmanagerbean,因此创建了循环引用,这导致HelpProvider无法创建。我认为这就是问题所在,应该在代码中留下注释,CommandFramework和ShardManager所需的所有对象都需要检查它们的引用。但是,如果我遇到一些对象相互依赖的问题,并且我无法轻松更改代码来解决这个问题,我该怎么办?首先想到的是设置两个不同的配置。一个用于创建ShardManager
bean,另一个用于创建CommandFramework
bean。它们都依赖于不同的组件来构建。如果您想指定bean创建顺序,还可以使用@Order
或@DependsOn
注释。我仍然不推荐这种方法ShardManager
取决于JDAListener
和CommandFramework
上的JDAListener
。但是,CommandFramework
也依赖于ShardManager
。
@Component
class HelperProvider {
@Autowired
Config config;
}
@Configuration
class Config {
@Autowired
HelperProvider helperProvider
}