将Mongeez与Spring Boot和Spring Data MongoDB集成

时间:2015-07-06 15:25:22

标签: spring-boot spring-data-mongodb

我想将Mongeez与我的Spring Boot应用程序集成,并想知道如何在应用程序启动期间正确运行Mongeez。 Mongeez suggests创建一个MongeezRunner bean。但是,挑战是在任何Spring Data初始化发生之前运行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();
}

它有效,但感觉就像一个黑客。还有其他办法吗?

1 个答案:

答案 0 :(得分:9)

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

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