java - Spring Autowired 组件在 bean 方法中为 null

标签 java spring spring-boot

我正在尝试在 @Configuration 类中使用 @Autowired 变量,其中在方法中使用 @Bean 创建 bean 。然而,我需要用来创建 bean 的组件是 null

@Autowired
private JDAListener listener;

@Bean
public ShardManager shardManager() throws LoginException, IllegalArgumentException {
    DefaultShardManagerBuilder builder = DefaultShardManagerBuilder.createDefault(this.botToken)
            .enableIntents(GatewayIntent.GUILD_MEMBERS)
            .setStatus(OnlineStatus.IDLE)
            .setShardsTotal(this.totalShards)
            .addEventListeners(Arrays.asList(this.listener)); //throws Exception

    return builder.build();
}

我得到的异常如下:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'config': 
Unsatisfied dependency expressed through field 'shardManager'; nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'shardManager' defined in class path resource [dev/teamnight/nightbot/Config.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: 
Failed to instantiate [net.dv8tion.jda.api.sharding.ShardManager]: Circular reference involving containing bean 'config' - consider declaring the factory method as static for independence from its containing instance. Factory method 'shardManager' threw exception; 
nested exception is java.lang.IllegalArgumentException: listeners may not be null

最佳答案

我假设代码片段是某种配置的一部分(用@Configuration注释的东西,甚至可能是@SpringBootApplication)。

在这种情况下:

  1. 使 JDAListener 也由 Spring 容器管理。
  2. 通过将参数传递给 shardManager 方法,将 JDAListener bean 实例注入(inject)分片管理器

您最终将得到如下所示的代码:

@Configuration
public class MyConfiguration {


  @Bean // now jda listener is managed by spring!
  public JDAListener jdaListener() {
     return new JDAListener();
  }

  @Bean // note the parameter to the method
  public ShardManager shardManager(JDAListener jdaListener) throws LoginException, IllegalArgumentException {
        DefaultShardManagerBuilder builder = 
              DefaultShardManagerBuilder.createDefault(this.botToken)
                 .enableIntents(GatewayIntent.GUILD_MEMBERS)
                 .setStatus(OnlineStatus.IDLE)
                 .setShardsTotal(this.totalShards)
                 .addEventListeners(Arrays.asList(jdaListener)); //throws Exception

    return builder.build();
 }
}

关于java - Spring Autowired 组件在 bean 方法中为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62398103/

相关文章:

java - cron 表达式 : Run weekly on Tuesdays and Wednesdays starting NOW

java - 如何在 Spring Cloud Gateway 后面连接 React UI? (不使用 Zuul)

java - 接收器类 o.s.c.b.BootstrapApplicationListener$CloseContextOnFailureApplicationListener 未定义或继承 impl

java - 在 Spring Boot 中使用 MongoTemplate 检查 MongoDB 连接

java - Keycloak自定义Docker ProtocolMapper部署

java - 在java中将图像写入pdf文件

java - jetty 服务器 Web 应用程序和 lib 文件的自动更新程序

java - 将python文件+所有依赖项+解释器编译成一个java\.net(dll或exe)文件?

日期 JSON 序列化程序将列表转换为字符串的 java.lang.reflect.InitationTargetException

java - 无法从 http : maven-artifact-manager:pom:2. maven.apache.org/maven2 传输 org.apache.maven ://repo. 0.6