类中的MongoTemplate空指针异常

时间:2018-06-01 20:34:48

标签: spring mongodb spring-boot mongotemplate

我一直在寻找其他答案,但似乎没有一个对我有用,我有一个弹簧启动应用程序,我使用mongo和kafka。在我的run()方法所在的主类中,我能够@Autowired mongoTemplate并且它可以工作,但是在另一个类中我做了同样的事情,我在mongoTemplate上得到了一个空指针异常。

以下是两个类:

工作

@SpringBootApplication
public class ProducerConsumerApplication implements CommandLineRunner {

public static Logger logger = LoggerFactory.getLogger(ProducerConsumerApplication.class);

public static void main(String[] args) {
    SpringApplication.run(ProducerConsumerApplication.class, args).close();
}

@Autowired
private Sender sender;

@Autowired
MongoTemplate mongoTemplate;


@Override
public void run(String... strings) throws Exception {
    Message msg = new Message();
    msg.setCurrentNode("my_node");
    msg.setStartTime(System.currentTimeMillis());
    String json = "{ \"color\" : \"Orange\", \"type\" : \"BMW\" }";
    ObjectMapper objectMapper = new ObjectMapper();
    msg.setTest(objectMapper.readValue(json, new TypeReference<Map<String,Object>>(){}));
    sender.send(msg);

    mongoTemplate.createCollection("test123");
    mongoTemplate.dropCollection("test123");



}

不工作

@Component
public class ParentNode extends Node{
@Autowired
public MongoTemplate mongoTemplate;

public void execute(Message message) {

    try{

        // GET WORKFLOWS COLLECTION
        MongoCollection<Document> collection = mongoTemplate.getCollection("workflows"); 


    } catch(Exception e){
        e.printStackTrace();
    }
}

}

感谢您的帮助。非常感谢。

1 个答案:

答案 0 :(得分:0)

你可以尝试用setter或构造函数注入依赖:

方法1:

@Component
public class ParentNode extends Node{

  @Autowired
  public ParentNode(MongoTemplate mongoTemplate){
    this.mongoTemplate = mongoTemplate;
  }

  private final MongoTemplate mongoTemplate;

  public void execute(Message message) {

  try{

      // GET WORKFLOWS COLLECTION
      MongoCollection<Document> collection = mongoTemplate.getCollection("workflows"); 


  } catch(Exception e){
      e.printStackTrace();
  }
}

方法2:

@Component
public class ParentNode extends Node{

  @Autowired
  public void setMongoTemplate(MongoTemplate mongoTemplate){
    ParentNode.mongoTemplate = mongoTemplate;
  }

  static private MongoTemplate mongoTemplate;

  public void execute(Message message) {

  try{

      // GET WORKFLOWS COLLECTION
      MongoCollection<Document> collection = mongoTemplate.getCollection("workflows"); 


  } catch(Exception e){
      e.printStackTrace();
  }
}