0

我有以下虚拟类:

@Document("items")
static class Item {
    int i;

    public Item() {
    }

    public Item(int i) {
        this.i = i;
    }

    public int getI() {
        return i;
    }
}

这是一个简单的@Changeset

//@Autowired
@ChangeSet(order = "001", id = "add_items", author = "tester")
public void changeset1(MongoTemplate mongoTemplate) {
    for (int i = 0; i < NUM_OF_DB_ITEMS; i++) {
        mongoTemplate.insert(new Item(i));
    }
}

调用后@Changeset,单元测试正在运行(注意 mongoTemplate 是@Autowired

@Test
public void test() {
    List<Item> items = mongoTemplate.findAll(Item.class);
    System.out.println(items);
}

问题:我从findAll()

我发现当我添加它@Autowiredchangeset1()确实有效(上面评论过) - 我得到了所有项目。

你能解释一下为什么吗?在示例中,我认为他们不需要@Autowired

我应该这样做吗?我的意思是,它会损坏 Mongock 的锁定机制吗?

4

3 回答 3

2

我遇到了同样的问题,在我的情况下,bean 创建者/运行者的构建器属性“changeLogScanPackage”的包名称拼写错误

@Bean
public SpringMongock springMongock(MongoTemplate mongoTemplate, Environment springEnvironment) {
  return new SpringMongockBuilder(mongoTemplate, "changeLogScanPackage")
        .setSpringEnvironment(springEnvironment)
      .setLockQuickConfig() OR .setLockConfig(3, 4, 3) 
       ...other setters
      .build();
}
于 2020-06-01T00:50:07.470 回答
2

如果没有完整的代码,很难弄清楚出了什么问题。很可能没有正确配置 spring 配置,因此如果没有 autowire 注释,则 mongoTemplate 无法在 Spring 容器中正确实例化。如果您想更深入地跟踪 MongoTemplate 源代码并比较注释更改之前和之后的执行路径,您会发现原因。

我建议按照他们的示例找出您的项目中缺少的任何内容。https://github.com/cloudyrock/mongock-samples/tree/master/samples-mongock-spring/sample-mongock-spring-v2

于 2019-09-01T13:04:53.030 回答
1

我意识到这是一个老问题,但是根据 Mongock文档,您需要使用MongockTemplate,而不是MongoTemplate

于 2021-10-06T05:04:55.880 回答