在 Spring Boot 应用程序中使用嵌入式 MongoDb 以及 MongoTemplate 失败

Posted

技术标签:

【中文标题】在 Spring Boot 应用程序中使用嵌入式 MongoDb 以及 MongoTemplate 失败【英文标题】:Using embedded MongoDb in Spring Boot application along with MongoTemplate fails 【发布时间】:2017-07-25 09:57:22 【问题描述】:

我有 Spring Boot 应用程序:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication()
public class App 

    public static void main(String[] args) 
        SpringApplication.run(App.class, args);
    


build.gradle 包含:

testCompile 组:“de.flapdoodle.embed”,名称: “de.flapdoodle.embed.mongo”,版本:“2.0.0”

编译("org.springframework.boot:spring-boot-starter-data-mongodb")

有使用 MongoTemplate 的控制器

@RestController
@RequestMapping(Constants.MAILBOX_BASE_PATH)
public class MController 

    private static final Logger log = LoggerFactory.getLogger(MailboxController.class);

    private MongoTemplate mongoTemplate;

    @Autowired
    public MController(MongoTemplate mongoTemplate) 
        this.mongoTemplate = mongoTemplate;
    

然后测试

@RunWith(SpringRunner.class)
@SpringBootTest()
@AutoConfigureMockMvc
public class MontrollerTests  

    @Autowired
    private MockMvc mvc;

    private MongoTemplate _mongoTemplate;
...

我的意图是使用嵌入式 MongoDB 进行上述测试。 当我运行它时,会弹出以下错误:

2017-03-05 17:14:51.993 错误 27857 --- [主要] os.s.boot.SpringApplication : 应用启动失败

org.springframework.beans.factory.UnsatisfiedDependencyException: 创建定义名称为“mController”的 bean 时出错...

在堆栈跟踪的

java.lang.IllegalStateException: 无效的 mongo 配置,要么 必须指定 uri 或 host/port/credentials

我的应用程序属性:

server.port=8090
spring.data.mongodb.uri=mongodb://localhost:27017/test
spring.data.mongodb.port=27017

如何解决这个问题? 提前致谢。

【问题讨论】:

测试中不需要mongo模板引用。当您对类路径有flap doodle依赖时,该测试将创建一个嵌入式mongo模板并自动连接到控制器中。这几乎就是你所需要的。如果这不起作用,请尝试在您的测试类中显式添加 @EmbeddedMongoAutoConfiguration 注释。 【参考方案1】:

您可以尝试使用EmbeddedMongoFactoryBean 类为mongoTemplate 创建一个@Bean 吗?例如:

@Bean
public MongoTemplate mongoTemplate() throws IOException 
    EmbeddedMongoFactoryBean mongo = new EmbeddedMongoFactoryBean();
    mongo.setBindIp("127.0.0.1");
    MongoClient mongoClient = mongo.getObject();
    MongoTemplate mongoTemplate = new MongoTemplate(mongoClient, "some_database");
    return mongoTemplate;

【讨论】:

嗨,谢谢。您建议将 bean 功能放在哪里?在应用程序类中? 是的,那个类或任何用@Configuration注释的类 同样的错误弹出,对于 EmbeddedMongoFactoryBean 我不得不下载一些库 图书馆的缺失应该导致ClassNotFoundException,不知道为什么不是这样 我已经添加了库,然后再次运行测试并弹出相同的错误

以上是关于在 Spring Boot 应用程序中使用嵌入式 MongoDb 以及 MongoTemplate 失败的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CommandLineJobRunner 调用嵌入在 Spring Boot 应用程序中的 Spring Batch 作业

是否可以在 Spring Boot 中运行两个使用 spring.jpa.generate-ddl 填充的嵌入式数据库?

无法在 Spring Boot 中启动嵌入式 Tomcat [重复]

如何在 Spring Boot 应用程序的嵌入式 untertow 中禁用 HTTP TRACE

使用带有嵌入式 Tomcat 的 Spring Boot Weblfux

使用嵌入式 tomcat 未在 Spring Boot 中映射请求