在 springboot 应用程序上创建 mongobee bean 时出错(在 运行 测试中)
Error creating mongobee bean on springboot app (on run of tests)
我使用所有鞋楦版本(修复其他问题)
mongobee 0.13
fongo 2.2.0-RC3-SNAPSHOT
mongodb-driver 3.8.2
当我 运行 我的应用程序时,出现此错误:
org.springframework.beans.factory.BeanCreationException:创建名称为 'mongobeeStandalone' 的 bean 在 class 路径资源 [com/myproject/company/configuration/MongoConfiguration.class] 中定义时出错:调用 init 方法失败;嵌套异常是 java.lang.AbstractMethodError: com.mongodb.client.internal.FongoOperationExecutor.execute(Lcom/mongodb/operation/ReadOperation;Lcom/mongodb/ReadPreference;Lcom/mongodb/ReadConcern;)Ljava/lang/Object; ... 原因:java.lang.AbstractMethodError:com.mongodb.client.internal.FongoOperationExecutor.execute(Lcom/mongodb/operation/ReadOperation;Lcom/mongodb/ReadPreference;Lcom/mongodb/ReadConcern;)Ljava/lang/Object;
我的class:
@Bean
public Mongobee mongobeeStandalone(final MongoTemplate mongoTemplate, final MongoClient mongoClient) {
final Mongobee runner = new Mongobee(mongoClient);
runner.setChangeLogsScanPackage(Changelog1.class.getPackage().getName()); // package to scan for changesets
runner.setDbName(mongoTemplate.getDb().getName());
return runner;
}
@Bean
public MongoClient mongoClient(final MongoDbFactory mongoDbFactory) {
final Mongo mongo = mongoDbFactory.getLegacyDb().getMongo();
if (!MongoClient.class.isInstance(mongo)) {
throw new UnsupportedOperationException("Must be a MongoClient");
}
return MongoClient.class.cast(mongo);
}
编辑
我的测试配置:
@Configuration
public class FoncgoConfiguration extends AbstractMongoConfiguration {
@Bean
public Fongo fongo() {
return new Fongo("mongo-test");
}
@Override
@Bean
public MongoTemplate mongoTemplate() throws Exception {
final SimpleMongoDbFactory simpleMongoDbFactory = new SimpleMongoDbFactory(mongoClient(), getDatabaseName());
final MongoTemplate mongoTemplate = new MongoTemplate(simpleMongoDbFactory, mappingMongoConverter());
return mongoTemplate;
}
@Override
@Bean
public MongoClient mongoClient() {
return MockMongoClient.create(fongo());
}
}
您应该使用 Spring 数据 Mongo,它将创建并注入 com.mongodb.MongoClient
bean。所以删除 mongoClient()
方法并添加 Mongodb Spring 数据依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
Spring Boot 还提供了一个 MongoTemplate
bean 并自动配置它。对于测试,您应该使用 Embedded Mongo with @DataMongoTest annotation, because it configures a MongoTemplate
. See here 作为测试示例。
我使用所有鞋楦版本(修复其他问题)
mongobee 0.13
fongo 2.2.0-RC3-SNAPSHOT
mongodb-driver 3.8.2
当我 运行 我的应用程序时,出现此错误:
org.springframework.beans.factory.BeanCreationException:创建名称为 'mongobeeStandalone' 的 bean 在 class 路径资源 [com/myproject/company/configuration/MongoConfiguration.class] 中定义时出错:调用 init 方法失败;嵌套异常是 java.lang.AbstractMethodError: com.mongodb.client.internal.FongoOperationExecutor.execute(Lcom/mongodb/operation/ReadOperation;Lcom/mongodb/ReadPreference;Lcom/mongodb/ReadConcern;)Ljava/lang/Object; ... 原因:java.lang.AbstractMethodError:com.mongodb.client.internal.FongoOperationExecutor.execute(Lcom/mongodb/operation/ReadOperation;Lcom/mongodb/ReadPreference;Lcom/mongodb/ReadConcern;)Ljava/lang/Object;
我的class:
@Bean
public Mongobee mongobeeStandalone(final MongoTemplate mongoTemplate, final MongoClient mongoClient) {
final Mongobee runner = new Mongobee(mongoClient);
runner.setChangeLogsScanPackage(Changelog1.class.getPackage().getName()); // package to scan for changesets
runner.setDbName(mongoTemplate.getDb().getName());
return runner;
}
@Bean
public MongoClient mongoClient(final MongoDbFactory mongoDbFactory) {
final Mongo mongo = mongoDbFactory.getLegacyDb().getMongo();
if (!MongoClient.class.isInstance(mongo)) {
throw new UnsupportedOperationException("Must be a MongoClient");
}
return MongoClient.class.cast(mongo);
}
编辑
我的测试配置:
@Configuration
public class FoncgoConfiguration extends AbstractMongoConfiguration {
@Bean
public Fongo fongo() {
return new Fongo("mongo-test");
}
@Override
@Bean
public MongoTemplate mongoTemplate() throws Exception {
final SimpleMongoDbFactory simpleMongoDbFactory = new SimpleMongoDbFactory(mongoClient(), getDatabaseName());
final MongoTemplate mongoTemplate = new MongoTemplate(simpleMongoDbFactory, mappingMongoConverter());
return mongoTemplate;
}
@Override
@Bean
public MongoClient mongoClient() {
return MockMongoClient.create(fongo());
}
}
您应该使用 Spring 数据 Mongo,它将创建并注入 com.mongodb.MongoClient
bean。所以删除 mongoClient()
方法并添加 Mongodb Spring 数据依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
Spring Boot 还提供了一个 MongoTemplate
bean 并自动配置它。对于测试,您应该使用 Embedded Mongo with @DataMongoTest annotation, because it configures a MongoTemplate
. See here 作为测试示例。