Mongock 迁移失败 运行 mongockSpringLegacyMigration

Mongock migration fails to run mongockSpringLegacyMigration

我正在尝试 运行 mongock 通过版本控制来处理我的数据库迁移,但是从 mongock 基础设施中得到一个例外, 另请注意,我没有使用 spring-仅引导 spring bean 系统, 我没有使用 spring boot...

的选项

Pom 和代码片段:

            <dependency>
                <groupId>com.github.cloudyrock.mongock</groupId>
                <artifactId>mongock-standalone</artifactId>
                <version>4.1.19</version>
            </dependency>
            <dependency>
                <groupId>com.github.cloudyrock.mongock</groupId>
                <artifactId>mongodb-springdata-v2-driver</artifactId>
                <version>4.1.19</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-mongodb</artifactId>
                <version>2.1.5.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.mongodb</groupId>
                <artifactId>mongo-java-driver</artifactId>
                <version>3.8.2</version>
            </dependency>

代码:

@Configuration
@Import({MongoSelectorContext.class})
public class MongockBeans {

    private final MongoSelectorContext mongoSelectorContext;

    public MongockBeans(MongoSelectorContext mongoSelectorContext) {
        this.mongoSelectorContext = mongoSelectorContext;
    }

    @Bean
    public void updateMongoTemplateSchema() {
        MongoTemplate mongoTemplate = mongoSelectorContext.mongoTemplateProvider().getMongoTemplateByDatabaseAlias("test");
        MongockStandalone.builder()
                .setDriver(SpringDataMongo2Driver.withDefaultLock(mongoTemplate))
                .addChangeLogClass(TestChangeLog.class)
                .buildRunner().execute();
    }
}

Mongo 模板已按原样提供 但是我抛出了以下错误,错误是从 mongock 抛出的,而不是从我的变更集中抛出的, 它甚至不执行我的更改集。 任何帮助都是合适的

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
    at com.citi.qi.core.platform.CorePlatformLauncher.start(CorePlatformLauncher.java:39)
    at com.citi.quickinsight.evaluation.engine.EngineMain.main(EngineMain.java:35)
...
Caused by: io.changock.migration.api.exception.ChangockException: Error in method[MongockV3LegacyMigrationChangeRunAlwaysLog.mongockSpringLegacyMigration] : Wrong parameter[MongockLegacyMigration] with name: legacy-migration
    at io.changock.runner.core.MigrationExecutor.processExceptionOnChangeSetExecution(MigrationExecutor.java:195)
    at io.changock.runner.core.MigrationExecutor.processSingleChangeSet(MigrationExecutor.java:102)
    at io.changock.runner.core.MigrationExecutor.lambda$processSingleChangeLog(MigrationExecutor.java:94)
    at io.changock.runner.core.MigrationExecutor.executeInTransactionIfStrategyOrUsualIfNot(MigrationExecutor.java:80)
    at io.changock.runner.core.MigrationExecutor.processSingleChangeLog(MigrationExecutor.java:94)
    at io.changock.runner.core.MigrationExecutor.lambda$processAllChangeLogs(MigrationExecutor.java:88)
    at io.changock.runner.core.MigrationExecutor.executeInTransactionIfStrategyOrUsualIfNot(MigrationExecutor.java:80)
    at io.changock.runner.core.MigrationExecutor.processAllChangeLogs(MigrationExecutor.java:88)
    at io.changock.runner.core.MigrationExecutor.lambda$executeMigration[=13=](MigrationExecutor.java:69)
    at io.changock.runner.core.MigrationExecutor.executeInTransactionIfStrategyOrUsualIfNot(MigrationExecutor.java:80)
    at io.changock.runner.core.MigrationExecutor.executeMigration(MigrationExecutor.java:69)
    at io.changock.runner.core.ChangockBase.execute(ChangockBase.java:49)
    at com.citi.quickinsight.MongockBeans.updateMongoTemplateSchema(MongockBeans.java:29)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157)
    ... 14 more
Caused by: io.changock.driver.api.common.DependencyInjectionException: Wrong parameter[MongockLegacyMigration] with name: legacy-migration
    at io.changock.runner.core.MigrationExecutor.lambda$getParameter(MigrationExecutor.java:182)
    at java.util.Optional.orElseThrow(Optional.java:290)
    at io.changock.runner.core.MigrationExecutor.getParameter(MigrationExecutor.java:182)
    at io.changock.runner.core.MigrationExecutor.executeChangeSetMethod(MigrationExecutor.java:171)
    at io.changock.runner.core.MigrationExecutor.executeAndLogChangeSet(MigrationExecutor.java:127)
    at io.changock.runner.core.MigrationExecutor.processSingleChangeSet(MigrationExecutor.java:100)
    ... 32 more

这需要更深入地研究,但我猜你在开发环境中,你可以尝试这个解决方法,它只是暂时让你继续工作。

private MongockLegacyMigration getLegacyMigration() {
    MongockLegacyMigration mongockLegacyMigration = new MongockLegacyMigration();
    mongockLegacyMigration.setCollectionName("no-existing-collection");
    return mongockLegacyMigration;
}

@PostConstruct
public MongockStandalone.Runner updateMongoTemplateSchema(MongoTemplate mongoTemplate) {
    return MongockStandalone.builder()
            .setDriver(SpringDataMongo2Driver.withDefaultLock(mongoTemplate))
            .addChangeLogClass(ClientInitializerChangeLog.class)
            .setLegacyMigration(getLegacyMigration())
            .buildRunner();
}

请注意,您提供的是不存在的 legacyMigration。这不是 right/final 解决方案,但不会有任何坏处,而且由于您正在开发(我的假设),这可以让您继续工作。

虽然之前的解决方法有效,但这是由于 Mongock 错误 #268,已在 4.2 版中修复。3.BETA。

The actual issue is that when no package is set in the builder, the reflections library gets an empty package list and instead on return nothing, it returns everything in the classpath.

As 99% are not annotated, they are ignored, but it finds the legacy migration and runs it.

Solution: Just avoid calling the reflections library if the package list is empty