mongodb - 如何使`org.mongodb.driver.cluster`在spring boot中使用嵌入式mongodb?
问题描述
尝试将嵌入式 mongodb 用于我的 springlocal
配置文件。这是 MongoTemplate 的配置
@Configuration
@Profile("local")
public class LocalMongoConfig {
private static final String MONGO_DB_URL = "localhost";
private static final String MONGO_DB_NAME = "embeded_db";
@Bean
@Primary
public MongoTemplate mongoTemplate() throws IOException {
EmbeddedMongoFactoryBean mongo = new EmbeddedMongoFactoryBean();
mongo.setBindIp(MONGO_DB_URL);
MongoClient mongoClient = mongo.getObject();
MongoTemplate mongoTemplate = new MongoTemplate(mongoClient, MONGO_DB_NAME);
return mongoTemplate;
}
}
这是application-local.yml
spring:
data:
mongodb:
uri: mongodb://127.0.0.1:27017/embeded_db
但是当从日志运行应用程序时,我可以看到嵌入式 mongodb 是从随机端口开始的。
13:53:49.849 [Thread-7] INFO org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongo - 2020-03-20T13:53:49.849+0800 I NETWORK [thread1] waiting for connections on port 51564
然后我得到以下错误,说connection refused
这是正确的,因为它试图连接到不同的端口(27017)
13:53:50.953 [restartedMain] INFO org.mongodb.driver.cluster - Cluster description not yet available. Waiting for 30000 ms before timing out
13:53:51.639 [cluster-ClusterId{value='5e745a6e973cbd4bd45d073e', description='null'}-127.0.0.1:27017] INFO org.mongodb.driver.cluster - Exception in monitor thread while connecting to server 127.0.0.1:27017
com.mongodb.MongoSocketOpenException: Exception opening socket
at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:67)
at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126)
at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.ConnectException: Connection refused: connect
如何确保mongodb.driver
使用嵌入式 mongodb?
解决方案
有一种方法可以EmbeddedMongoFactoryBean
使用它来设置所需的端口。
/**
* The port MongoDB should run on. When no port is provided, then some free
* server port is automatically assigned. The value must be between 0 and 65535.
*/
public void setPort(int port) {
builder.port(port);
}
尝试这个:
@Bean
@Primary
public MongoTemplate mongoTemplate() throws IOException {
EmbeddedMongoFactoryBean mongo = new EmbeddedMongoFactoryBean();
mongo.setPort(27017); //here
mongo.setBindIp(MONGO_DB_URL);
MongoClient mongoClient = mongo.getObject();
MongoTemplate mongoTemplate = new MongoTemplate(mongoClient, MONGO_DB_NAME);
return mongoTemplate;
}
但是根据文档,您应该这样做:
@Bean(destroyMethod = "close")
@Profile("local")
MongoClient mongo(){
return new EmbeddedMongoBuilder().port().bindIp().build();
}
推荐阅读
- axon - 如何查看 Axon 数据库中有哪些字段可用?
- git - 当我使用 git stash 时,我最终得到 <<<<<<< 更新了上游和文件中的其他内容
- c++ - 创建容器的模板类
- eloquent - whereRaw 查询范围内的变量丢失值
- youtube-api - 正在设置 Youtube API 凭据 - 错误:deleted_client OAuth 客户端已被删除
- django - 使用多对多关系更改 Django 模型的主键
- optimization - 从 N 组中找到 k 组值的算法,使得 k 组中唯一值的数量最大化
- vue.js - Vue.js - 努力让 DatePicker 工作的组件
- asp.net - AngularJs如何从ASP.MVC5下载文件传递参数
- javascript - 如何使用 SASS 动态切换颜色主题?