mongock迁移无法运行mongockspringlegacymigration

kmb7vmvb  于 2021-07-11  发布在  Java
关注(0)|答案(2)|浏览(399)

我试图运行mongock来处理我的db迁移和版本控制,但是mongock基础设施出现了一个异常,也请注意我没有使用springboot,只有springbean系统,我没有选择使用springboot。。。
pom和代码段:

  1. <dependency>
  2. <groupId>com.github.cloudyrock.mongock</groupId>
  3. <artifactId>mongock-standalone</artifactId>
  4. <version>4.1.19</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.github.cloudyrock.mongock</groupId>
  8. <artifactId>mongodb-springdata-v2-driver</artifactId>
  9. <version>4.1.19</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.data</groupId>
  13. <artifactId>spring-data-mongodb</artifactId>
  14. <version>2.1.5.RELEASE</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.mongodb</groupId>
  18. <artifactId>mongo-java-driver</artifactId>
  19. <version>3.8.2</version>
  20. </dependency>

代码:

  1. @Configuration
  2. @Import({MongoSelectorContext.class})
  3. public class MongockBeans {
  4. private final MongoSelectorContext mongoSelectorContext;
  5. public MongockBeans(MongoSelectorContext mongoSelectorContext) {
  6. this.mongoSelectorContext = mongoSelectorContext;
  7. }
  8. @Bean
  9. public void updateMongoTemplateSchema() {
  10. MongoTemplate mongoTemplate = mongoSelectorContext.mongoTemplateProvider().getMongoTemplateByDatabaseAlias("test");
  11. MongockStandalone.builder()
  12. .setDriver(SpringDataMongo2Driver.withDefaultLock(mongoTemplate))
  13. .addChangeLogClass(TestChangeLog.class)
  14. .buildRunner().execute();
  15. }
  16. }

mongo模板是按它应该的方式提供的,但是我得到了以下抛出的错误,错误是从mongock而不是从我的变更集中抛出的,它甚至不执行我的变更集。任何帮助都是值得的

  1. Exception in thread "main" java.lang.RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongockBeans': Invocation of init method failed; nested exception is io.changock.migration.api.exception.ChangockException: Error in method[MongockV3LegacyMigrationChangeRunAlwaysLog.mongockSpringLegacyMigration] : Wrong parameter[MongockLegacyMigration] with name: legacy-migration
  2. at com.citi.qi.core.platform.CorePlatformLauncher.start(CorePlatformLauncher.java:39)
  3. at com.citi.quickinsight.evaluation.engine.EngineMain.main(EngineMain.java:35)
  4. ...
  5. Caused by: io.changock.migration.api.exception.ChangockException: Error in method[MongockV3LegacyMigrationChangeRunAlwaysLog.mongockSpringLegacyMigration] : Wrong parameter[MongockLegacyMigration] with name: legacy-migration
  6. at io.changock.runner.core.MigrationExecutor.processExceptionOnChangeSetExecution(MigrationExecutor.java:195)
  7. at io.changock.runner.core.MigrationExecutor.processSingleChangeSet(MigrationExecutor.java:102)
  8. at io.changock.runner.core.MigrationExecutor.lambda$processSingleChangeLog$2(MigrationExecutor.java:94)
  9. at io.changock.runner.core.MigrationExecutor.executeInTransactionIfStrategyOrUsualIfNot(MigrationExecutor.java:80)
  10. at io.changock.runner.core.MigrationExecutor.processSingleChangeLog(MigrationExecutor.java:94)
  11. at io.changock.runner.core.MigrationExecutor.lambda$processAllChangeLogs$1(MigrationExecutor.java:88)
  12. at io.changock.runner.core.MigrationExecutor.executeInTransactionIfStrategyOrUsualIfNot(MigrationExecutor.java:80)
  13. at io.changock.runner.core.MigrationExecutor.processAllChangeLogs(MigrationExecutor.java:88)
  14. at io.changock.runner.core.MigrationExecutor.lambda$executeMigration$0(MigrationExecutor.java:69)
  15. at io.changock.runner.core.MigrationExecutor.executeInTransactionIfStrategyOrUsualIfNot(MigrationExecutor.java:80)
  16. at io.changock.runner.core.MigrationExecutor.executeMigration(MigrationExecutor.java:69)
  17. at io.changock.runner.core.ChangockBase.execute(ChangockBase.java:49)
  18. at com.citi.quickinsight.MongockBeans.updateMongoTemplateSchema(MongockBeans.java:29)
  19. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  20. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  21. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  22. at java.lang.reflect.Method.invoke(Method.java:498)
  23. at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389)
  24. at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333)
  25. at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157)
  26. ... 14 more
  27. Caused by: io.changock.driver.api.common.DependencyInjectionException: Wrong parameter[MongockLegacyMigration] with name: legacy-migration
  28. at io.changock.runner.core.MigrationExecutor.lambda$getParameter$4(MigrationExecutor.java:182)
  29. at java.util.Optional.orElseThrow(Optional.java:290)
  30. at io.changock.runner.core.MigrationExecutor.getParameter(MigrationExecutor.java:182)
  31. at io.changock.runner.core.MigrationExecutor.executeChangeSetMethod(MigrationExecutor.java:171)
  32. at io.changock.runner.core.MigrationExecutor.executeAndLogChangeSet(MigrationExecutor.java:127)
  33. at io.changock.runner.core.MigrationExecutor.processSingleChangeSet(MigrationExecutor.java:100)
  34. ... 32 more
jtjikinw

jtjikinw1#

这需要更深入地研究,但我猜您是在开发环境中,您可以尝试这个变通方法,这只是暂时的,您可以继续工作。

  1. private MongockLegacyMigration getLegacyMigration() {
  2. MongockLegacyMigration mongockLegacyMigration = new MongockLegacyMigration();
  3. mongockLegacyMigration.setCollectionName("no-existing-collection");
  4. return mongockLegacyMigration;
  5. }
  6. @PostConstruct
  7. public MongockStandalone.Runner updateMongoTemplateSchema(MongoTemplate mongoTemplate) {
  8. return MongockStandalone.builder()
  9. .setDriver(SpringDataMongo2Driver.withDefaultLock(mongoTemplate))
  10. .addChangeLogClass(ClientInitializerChangeLog.class)
  11. .setLegacyMigration(getLegacyMigration())
  12. .buildRunner();
  13. }

请注意,您提供的是一个不存在的legacymigration。这不是正确的/最终的解决方案,但不会造成伤害,因为您正在开发(我的假设),这允许您继续工作。

展开查看全部
vdgimpew

vdgimpew2#

虽然以前的解决方案可以工作,但这是由于mongock bug#268,它已在4.2.3.beta版中修复。
实际问题是,当生成器中没有设置包时,反射库会得到一个空包列表,而不是返回nothing时,它会返回类路径中的所有内容。
由于99%没有注解,它们被忽略,但它会找到遗留迁移并运行它。
解决方案:如果包列表为空,请避免调用反射库

相关问题