Spring Boot Starter-Web tries to connect to Mongo at startup

匿名 (未验证) 提交于 2019-12-03 09:52:54

问题:

I am experiencing some problems using Spring Boot and MongoDB external driver. I can't use the project Spring Data MongoDB, because I need to use the ufficial async driver given by Mongo. However, I need to use Spring Boot, because the module I am developing is part of a bigger project using this library.

Here is my pom.xml file.

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">     <modelVersion>4.0.0</modelVersion>      <artifactId>tx-view</artifactId>     <version>1.0-SNAPSHOT</version>      <!-- omissis -->      <properties>         <java.version>1.8</java.version>     </properties>      <dependencies>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-actuator</artifactId>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-web</artifactId>         </dependency>         <dependency>             <groupId>org.mongodb</groupId>             <artifactId>mongodb-driver-async</artifactId>             <version>${mongodb.version}</version>         </dependency>      </dependencies>      <build>         <plugins>             <plugin>                  <groupId>org.springframework.boot</groupId>                  <artifactId>spring-boot-maven-plugin</artifactId>             </plugin>             <plugin>                 <groupId>com.spotify</groupId>                 <artifactId>docker-maven-plugin</artifactId>             </plugin>         </plugins>     </build> </project>

In detail, I am using Spring Boot 1.4.1 and Mongo Async Driver 3.2.2.

Here is my application.

@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class}) public class TxViewApplication {     public static void main(String[] args) {         SpringApplication.run(TxViewApplication.class, args);     }      @Value("${mongo.uri}")     private String mongoUri;      @Bean     public MongoClient mongoClient() {         return MongoClients.create(mongoUri);     } }

It follows the only (empty) test I have at the moment.

@SpringBootTest @RunWith(SpringRunner.class) public class ApplicationTest {     @Test     public void loadContext() throws Exception {} }

I have no other code in this project. When I run the test, I have the following error:

2016-11-22 15:43:58.597  INFO 4572 --- [null'}-db:27017] org.mongodb.driver.cluster               : Exception in monitor thread while connecting to server db:27017  com.mongodb.MongoException: java.io.IOException: Il computer remoto ha rifiutato la connessione di rete.  at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:125) ~[mongodb-driver-core-3.2.2.jar:na] at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:128) ~[mongodb-driver-core-3.2.2.jar:na] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_101] Caused by: java.io.IOException: Il computer remoto ha rifiutato la connessione di rete.  at sun.nio.ch.Iocp.translateErrorToIOException(Iocp.java:309) ~[na:1.8.0_101] at sun.nio.ch.Iocp.access$700(Iocp.java:46) ~[na:1.8.0_101] at sun.nio.ch.Iocp$EventHandlerTask.run(Iocp.java:399) ~[na:1.8.0_101] at sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112) ~[na:1.8.0_101] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_101] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_101] ... 1 common frames omitted

As you can see, I have properly inserted the exclude clause in the SpringBootApplication annotation in order to stop Spring Boot to try handle its own the connection to Mongo, as suggested in Mongo tries to connect automatically to port 27017(localhost).

I have also noticed that I started to have the error after the addition to the pom.xml of the dependency to spring-boot-starter-web.

How can I inhibit Spring Boot to try to connect automatically to Mongo at startup? The same problem is present with the synchronous version of MongoDB driver.

--- EDIT ---

I have also try to build a wrapper around the async.MongoClient object, in this way:

public class MongoWrapper {     private final MongoClient mongo;      public MongoWrapper() {         mongo = MongoClients.create();     }      public MongoClient getMongo() {         return mongo;     } }

The configuration was changed accordingly.

@Bean public MongoWrapper mongo() {     return new MongoWrapper(); }

Unfortunately, nothing had changed. Spring Boot seems to intercept the MongoClient object also in this way :(

Thanks a lot.

回答1:

You have a MongoClient bean in your own configuration which does not make any sense to me if you've excluded the auto-configuration.

I've commented out the @Bean definition in your own config and no attempt to connect to Mongo is performed now. I am not sure I answer to your question and you're probably looking for something else but if you don't want to use mongo, don't define a MongoClient in your own config!



回答2:

This helped us to disable async java driver of MongoDB to use default configuration:

@EnableAutoConfiguration(exclude = {MongoReactiveAutoConfiguration.class})


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!