我想将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();
}
它有效,但感觉就像一个黑客。还有其他办法吗?
答案 0 :(得分:9)
看了一下Spring Boot的源代码,结果发现这个问题并不是什么新鲜事。例如,FlywayAutoConfiguration
必须确保Flyway(基于SQL的数据库的迁移工具)在创建任何EntityManagerFactory
bean之前运行。为实现此目的,自动配置注册BeanFactoryPostProcessor
,动态地使每个EntityManagerFactory
bean依赖于Flyway bean,从而迫使Spring首先创建Flyway bean。
我通过为Mongeez创建一个类似的自动配置的Spring Boot启动器解决了我的问题:mongeez-spring-boot-starter。