关于依赖注入出现空指针异常(kafkaTemplate NullPointerException)

  • 今天在idea测试kafka推送的需求因为自己的粗心大意出现了一个Bug:在SpringBoot中的Resource Kafka template-Kafka应用程序抛出空指针,具体代码是这样的

    public class KafkaProducer {
        @Resource
        private KafkaTemplate<String, String> kafkaTemplate;
        
        // 示例代码
        public void sendMessage(Msg msg) {
            kafkaTemplate.send(msg);
        }
    }
    
  • 后面开始查找问题,觉得是因为这里出错了

    public class DirectoryWatcher {
        // 出错代码
        KafkaProducer kafkaProducer = new KafkaProducer();
        
        // 在该对象中调用某个方法
        public void watchDirectory() {
            kafkaProducer.sendMessage();
        }
    }
    
  • 这里出错的原因是:在我的代码中,手动创建了一个 KafkaProducer 对象,而没有通过 Spring 的依赖注入来创建它。

  • 以下就是我的解决方法

    1. 首先,将 KafkaProducer 类添加 @Component 注解,让它成为 Spring 管理的 Bean,如下所示:

      @Component
      public class KafkaProducer {
      }
      
    2. 接下来,将 KafkaProducer 注入到 DirectoryWatcher 类中,而不是手动创建新的对象。修改 DirectoryWatcher 类如下:

      @Component
      public class DirectoryWatcher {
          private final KafkaProducer kafkaProducer;
      
          @Autowired
          public DirectoryWatcher(KafkaProducer kafkaProducer) {
              this.kafkaProducer = kafkaProducer;
          }
      }
      
    3. 主类修改如下

      @SpringBootApplication
      public class DemoApplication {
      
          private static DirectoryWatcher directoryWatcher;
      
          @Autowired
          public DemoApplication(DirectoryWatcher directoryWatcher) {
              this.directoryWatcher = directoryWatcher;
          }
      
          public static void main(String[] args) {
              SpringApplication.run(DemoApplication.class, args);
      
              // 在构造函数中注入的 directoryWatcher 对象可以直接使用
              directoryWatcher.watchDirectory();
          }
      
      }