背景
springboot项目启动时,报错
- com.mongodb.MongoSocketOpenException: Exception opening socket
- at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70) ~[mongodb-driver-core-3.11.2.jar:na]
- at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:128) ~[mongodb-driver-core-3.11.2.jar:na]
- at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) ~[mongodb-driver-core-3.11.2.jar:na]
- at java.lang.Thread.run(Thread.java:748) [na:1.8.0_181]
- Caused by: java.net.ConnectException: Connection refused: connect
- at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:1.8.0_181]
- at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) ~[na:1.8.0_181]
- at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_181]
- at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_181]
- at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_181]
- at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_181]
- at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_181]
- at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_181]
- at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:64) ~[mongodb-driver-core-3.11.2.jar:na]
- at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:79) ~[mongodb-driver-core-3.11.2.jar:na]
- at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65) ~[mongodb-driver-core-3.11.2.jar:na]
- ... 3 common frames omitted
复制代码 而且用工具能够连接mongodb,已经排除是mongodb不能连接的问题
缘故原由
项目中设置了自界说的MongoClient:
- @Bean
- public MongoDatabase mongoDatabase() {
- String host = mongodbProperties.getHost();
- Integer port = mongodbProperties.getPort();
-
- MongoClientOptions.Builder options = new MongoClientOptions.Builder();
- options.connectionsPerHost(mongodbProperties.getPoolSize());
- options.threadsAllowedToBlockForConnectionMultiplier(mongodbProperties.getBlockSize());
- options.build();
-
- MongoClient mongoClient = null;
- ServerAddress serverAddress = new ServerAddress(mongodbProperties.getHost(), mongodbProperties.getPort());
- List<ServerAddress> seeds = new ArrayList<>();
- seeds.add(serverAddress);
- String userName = mongodbProperties.getUserName();
- String password = mongodbProperties.getPassword();
- if (StringUtils.isNotBlank(userName) && StringUtils.isNotBlank(password)){
-
- MongoCredential credentials = MongoCredential.createCredential(userName, mongodbProperties.getDatabase(), password.toCharArray());
- List<MongoCredential> credentialsList = new ArrayList<>();
- credentialsList.add(credentials);
- mongoClient = new MongoClient(seeds, credentialsList);
- }else {
- mongoClient = new MongoClient(host, port);
- }
-
- return mongoClient.getDatabase(mongodbProperties.getDatabase());
- }
复制代码 而springboot在启动时会自动实例化一个MongoClient:

源码如下:
解决方法
禁用SpringBoot对Mongo的自动设置,以免和自界说的设置冲突,在SpringBoot启动类上加上:
- @SpringBootApplication(exclude = MongoAutoConfiguration.class)
复制代码 由此可见,在任何springboot项目中,如果自界说了MongoClient且交与了springboot管理,都需要排除掉springboot对mongodb的自动设置
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |