将Mongeez与Spring Boot和Spring Data MongoDB集成



我想将Mongeez与我的Spring Boot应用程序集成,并且想知道如何在应用程序启动期间正确运行Mongeez。Mongeez建议创建一个MongeezRunner豆。但是,挑战在于在任何 Spring 数据初始化发生之前运行 Mongeez,特别是在创建MongoTemplate实例之前。这一点至关重要,因为数据库中可能存在阻止应用程序启动的更改(例如,更改索引定义(。

我目前的方法是自己提供MongoTemplate bean,在创建之前运行Mongeez:

@Bean
public MongoTemplate mongoTemplate(Mongo mongo, MongoDbFactory mongoDbFactory,
                                   MongoConverter converter) throws IOException {
    // make sure that Mongeez runs before Spring Data is initialized
    runMongeez(mongo);
    return new MongoTemplate(mongoDbFactory, converter);
}
private void runMongeez(Mongo mongo) throws IOException {
    Mongeez mongeez = new Mongeez();
    mongeez.setMongo(mongo);
    mongeez.setDbName(mongodbDatabaseName);
    mongeez.setFile(new ClassPathResource("/db/migrations.xml"));
    mongeez.process();
}

它有效,但感觉像一个黑客。还有其他方法可以做到这一点吗?

在查看了Spring Boot的源代码后,发现这个问题并不是什么新鲜事。例如,FlywayAutoConfiguration必须确保 Flyway(基于 SQL 的数据库的迁移工具(在创建任何EntityManagerFactory bean 之前运行。为了实现这一点,自动配置注册了一个BeanFactoryPostProcessor,该动态地使每个EntityManagerFactory豆都依赖于 Flyway bean,从而迫使 Spring 首先创建 Flyway bean。

我通过为Mongeez创建一个具有类似自动配置的Spring Boot启动器来解决我的问题:mongeez-spring-boot-starter。

最新更新