在 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