当前位置: 首页 > 知识库问答 >
问题:

用于数据库迁移的MongoDB'mongock'

阎功
2023-03-14

在我的Spring Boot项目中,我正在尝试为MongoDb实现一个数据库迁移,我对MongoDb和mongock非常陌生<下面是关于错误的一些详细信息,以及到目前为止我所做的工作:

>

  • 我的pom有以下依赖项:

       <artifactId>mongock-spring-v5</artifactId>
       <artifactId>mongodb-springdata-v3-driver</artifactId>
       <artifactId>mongock-bom</artifactId>
       <artifactId>testcontainers-bom</artifactId>
    

    我已经用“@EnableMongock”注释了我的SpringBoot类

    在这个类中,我创建了@ChangeSet(order="001", id="00.00.00.01",作者="farzain pathan")并将少量数据插入DB。

    在application.properties文件中添加以下行

    蒙哥克。更改日志扫描包=com。产品目标配置

    现在,当我构建项目“mvn clean install”时,我发现以下错误:

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongockBuilder' defined in class path resource [com/github/cloudyrock/spring/v5/MongockSpringDataV3CoreContext.class]: Bean instantiation via factory method failed; nested excep
    tion is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.github.cloudyrock.spring.v5.MongockSpring5$Builder]: Factory method 'mongockBuilder' threw exception; nested exception is java.lang.NullPointerException: Cannot invoke "java.ut
    il.List.iterator()" because "changeLogsScanPackage" is null
            at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658) ~[na:na]
            at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:349) ~[junit-jupiter-engine-5.7.0.jar:5.7.0]
            at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$4(ClassBasedTestDescriptor.java:270) ~[junit-jupiter-engine-5.7.0.jar:5.7.0]
            at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0]
            at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:269) ~[junit-jupiter-engine-5.7.0.jar:5.7.0]
            at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$2(ClassBasedTestDescriptor.java:259) ~[junit-jupiter-engine-5.7.0.jar:5.7.0]
            at java.base/java.util.Optional.orElseGet(Optional.java:362) ~[na:na]
            at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$3(ClassBasedTestDescriptor.java:258) ~[junit-jupiter-engine-5.7.0.jar:5.7.0]
            at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) ~[junit-jupiter-engine-5.7.0.jar:5.7.0]
            at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:101) ~[junit-jupiter-engine-5.7.0.jar:5.7.0]
            at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0]
            at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:100) ~[junit-jupiter-engine-5.7.0.jar:5.7.0]
            at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:65) ~[junit-jupiter-engine-5.7.0.jar:5.7.0]
            at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$1(NodeTestTask.java:111) ~[junit-platform-engine-1.7.0.jar:1.7.0]
            at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.7.0.jar:1.7.0]
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongockBuilder' defined in class path resource [com/github/cloudyrock/spring/v5/MongockSpringDataV3CoreContext.class]: Bean instantiation via factory method failed; n
    ested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.github.cloudyrock.spring.v5.MongockSpring5$Builder]: Factory method 'mongockBuilder' threw exception; nested exception is java.lang.NullPointerException: Cannot invo
    ke "java.util.List.iterator()" because "changeLogsScanPackage" is null
            at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) ~[spring-beans-5.3.3.jar:5.3.3]
            at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) ~[spring-beans-5.3.3.jar:5.3.3]
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1336) ~[spring-beans-5.3.3.jar:5.3.3]
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1179) ~[spring-beans-5.3.3.jar:5.3.3]
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:571) ~[spring-beans-5.3.3.jar:5.3.3]
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) ~[spring-beans-5.3.3.jar:5.3.3]
            at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.3.jar:5.3.3]
            at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.3.jar:5.3.3]
            at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.3.jar:5.3.3]
            at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.3.jar:5.3.3]
            at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) ~[spring-beans-5.3.3.jar:5.3.3]
            at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:923) ~[spring-context-5.3.3.jar:5.3.3]
            at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588) ~[spring-context-5.3.3.jar:5.3.3]
            at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) ~[spring-boot-2.4.2.jar:2.4.2]
            at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) ~[spring-boot-2.4.2.jar:2.4.2]
            at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) ~[spring-boot-2.4.2.jar:2.4.2]
            at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) ~[spring-boot-2.4.2.jar:2.4.2]
            at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:123) ~[spring-boot-test-2.4.2.jar:2.4.2]
            at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) ~[spring-test-5.3.3.jar:5.3.3]
            at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) ~[spring-test-5.3.3.jar:5.3.3]
            ... 69 common frames omitted
    Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.github.cloudyrock.spring.v5.MongockSpring5$Builder]: Factory method 'mongockBuilder' threw exception; nested exception is java.lang.NullPointerException: Cannot invoke "java
    .util.List.iterator()" because "changeLogsScanPackage" is null
            at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.3.3.jar:5.3.3]
            at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.3.jar:5.3.3]
            ... 88 common frames omitted
    Caused by: java.lang.NullPointerException: Cannot invoke "java.util.List.iterator()" because "changeLogsScanPackage" is null
            at io.changock.runner.core.builder.RunnerBuilderBase.addScanItemsFromConfig(RunnerBuilderBase.java:140) ~[changock-runner-core-1.1.11.jar:na]
            at io.changock.runner.core.builder.RunnerBuilderBase.setConfig(RunnerBuilderBase.java:125) ~[changock-runner-core-1.1.11.jar:na]
            at io.changock.runner.spring.v5.ChangockSpringBuilderBase.setConfig(ChangockSpringBuilderBase.java:56) ~[changock-spring-v5-runner-1.1.11.jar:na]
            at io.changock.runner.spring.v5.ChangockSpringBuilderBase.setConfig(ChangockSpringBuilderBase.java:30) ~[changock-spring-v5-runner-1.1.11.jar:na]
            at com.github.cloudyrock.spring.v5.MongockSpringDataCoreContextBase.mongockBuilder(MongockSpringDataCoreContextBase.java:15) ~[mongock-spring-v5-4.1.19.jar:na]
            at com.github.cloudyrock.spring.v5.MongockSpringDataV3CoreContext.mongockBuilder(MongockSpringDataV3CoreContext.java:42) ~[mongock-spring-v5-4.1.19.jar:na]
            at com.github.cloudyrock.spring.v5.MongockSpringDataV3CoreContext$$EnhancerBySpringCGLIB$$77ad1773.CGLIB$mongockBuilder$1(<generated>) ~[mongock-spring-v5-4.1.19.jar:na]
            at com.github.cloudyrock.spring.v5.MongockSpringDataV3CoreContext$$EnhancerBySpringCGLIB$$77ad1773$$FastClassBySpringCGLIB$$9b166dc9.invoke(<generated>) ~[mongock-spring-v5-4.1.19.jar:na]
            at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.3.3.jar:5.3.3]
            at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[spring-context-5.3.3.jar:5.3.3]
            at com.github.cloudyrock.spring.v5.MongockSpringDataV3CoreContext$$EnhancerBySpringCGLIB$$77ad1773.mongockBuilder(<generated>) ~[mongock-spring-v5-4.1.19.jar:na]
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) ~[na:na]
            at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
            at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
            at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.3.jar:5.3.3]
            ... 89 common frames omitted
    

    是的,我确实浏览了官方文件,但没有发现任何有用的东西
    (跟随youtube视频:链接)
    如果我需要提供更多信息,请告诉我,我真的在这里挣扎。

  • 共有1个答案

    牟波
    2023-03-14

    我需要更多的信息来弄清楚到底发生了什么。

    • Mongock,Spring版
    • 代码:至少您的Spring应用程序主类和属性文件
    • Pom文件,至少包含Mongock依赖项及其导入方式:使用依赖项管理器等

    我至少需要这个。

     类似资料:
    • 我的目标是为现有应用程序启用架构和数据迁移。 这种问题似乎已经被问过很多次了,不过我想是因为不同的要求和环境。 由于我在这个领域没有经验,请允许我先介绍一下应用程序的架构和我的假设。 该应用程序是一个多用户企业桌面应用程序,具有后端服务器,可以持久保存到任何主要数据库(MySql,Postgresql,SQL服务器,Oracle数据库等)。假设数据库是内部部署的,并由我们的客户维护。 使用的技术堆

    • 问题内容: 我正在使用Java开发数据库迁移工具。该工具将数据库表及其数据复制到目标数据库。但是我希望它可以在不同的数据库上工作。从mysql复制并在derby等中创建。使用JDBC,我们可以收集有关表及其列的足够信息。但是我要问的是,是否可以使用sql free在Java上重新创建表。我的意思是不同的数据库具有不同的数据类型,有时它们在sql语法上也有所不同。那么JDBC或任何其他库(可以是开放

    • 在开发和维护一个数据库驱动的应用程序时, 数据库的结构会像代码一样不断演变。 例如,在开发应用程序的过程中,会增加一张新表且必须得加进来; 在应用程序被部署到生产环境后,需要建立一个索引来提高查询的性能等等。 因为一个数据库结构发生改变的时候源代码也经常会需要做出改变, Yii 提供了一个 数据库迁移 功能,该功能可以记录数据库的变化, 以便使数据库和源代码一起受版本控制。 如下的步骤向我们展示了

    • 简介 迁移就像是数据库的版本控制, 允许团队简单轻松的编辑并共享应用的数据库表结构,迁移通常和 Laravel 的 数据库结构生成器配合使用,让你轻松地构建数据库结构。如果你曾经试过让同事手动在数据库结构中添加字段,那么数据库迁移可以让你不再需要做这样的事情。 Laravel 的 Schema 门面 对所有 Laravel 支持的数据库系统提供了创建和操作数据表的相应支持。 生成迁移 使用 Art

    • 数据库迁移可以理解为对数据库结构的版本管理,可以有效的解决团队中跨成员对数据库结构的管理。 生成迁移 通过 gen:migration 生成一个迁移文件,命令后面跟的是一个文件名参数,通常为这个迁移要打算做的事情。 php bin/hyperf.php gen:migration create_users_table 生成的迁移文件位于根目录下的 migrations 文件夹内,每个迁移文件都包

    • 在首次创建数据库,您可以使用版本0指定一个迁移运行时! 注意:任何提供的子类,如,UpdateTableMigration和应该只覆盖onPreMigrate()和调用super.onPreMigrate(),所以它的正确实例化。 基类,是一个非常简单的类来执行迁移: 此处是添加到数据库的列的一个例子: 现在,我们要添加一列到这个表。我们有两种方式: 通过Migration: