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
,因为autowired
HelperProvider
没有被注入

您正试图对空对象调用
.getClass()

通用依赖注入调试 只想添加一个快速的基本内容,因为这个问题的主要答案必须对您的代码库做出一些假设。当依赖项注入失败时,有几件事需要检查

  • 配置文件-这些文件是否已正确加载。最近是否禁用了组件扫描
  • 您的
    组件
    是否具有必要的
    @组件
    和/或
    @Service/@Controller/@Repository
    注释
  • 可能的根本问题-循环引用-BeanInstationException 在stacktrace中还提到循环引用,这可能是导致问题的原因

    <代码>:Orr.SrrgFraskWork.BeANS.BeaStistAutoExcExc:包含bean 'CONFIG的循环引用——考虑将工厂方法声明为独立于其包含实例的静态方法。工厂方法“commandFramework”引发异常;嵌套异常是java.lang.NullPointerException

    由于收到此错误消息,您引入了循环引用。这意味着。。。组件依赖于依赖于该组件的组件

    例如:

    @Component
    class HelperProvider {
       @Autowired
       Config config;
    }
    

    这种模式将阻碍spring框架,因为它们相互依赖来加载每个组件。如果进一步引入依赖项,就会发生这种情况。假设HelperProvider需要HelperHelperProvider,它需要配置

    您需要在最近的编辑中检查
    Config
    CommandFramework
    的任何新注入

    你该怎么办 您需要重新设计配置,以打破它对
    HelperProvider
    的依赖。这样做可以解决你未来的许多难题

    你不应该做什么
    可以使用
    @Lazy
    注释懒散地加载组件或配置。这样,bean仅在调用时实例化。如果您想在启动Spring
    ApplicationContext时了解更多细微差别,建议您这样做,但在以后的过程中维护它将成为一场噩梦。

    您遇到的错误很可能是因为您的项目中存在循环依赖关系。由于您是在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
    do
    this.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
    }