Java Spring Boot Starter Web尝试在启动时连接到Mongo
我在使用Spring Boot和MongoDB外部驱动程序时遇到一些问题。我不能使用project Spring Data MongoDB,因为我需要使用Mongo提供的ufficial异步驱动程序。但是,我需要使用SpringBoot,因为我正在开发的模块是使用该库的更大项目的一部分 这是我的Java Spring Boot Starter Web尝试在启动时连接到Mongo,java,spring,mongodb,spring-boot,Java,Spring,Mongodb,Spring Boot,我在使用Spring Boot和MongoDB外部驱动程序时遇到一些问题。我不能使用project Spring Data MongoDB,因为我需要使用Mongo提供的ufficial异步驱动程序。但是,我需要使用SpringBoot,因为我正在开发的模块是使用该库的更大项目的一部分 这是我的pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/
pom.xml
文件
<?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>
这是我目前唯一的(空的)测试
@SpringBootTest
@RunWith(SpringRunner.class)
public class ApplicationTest {
@Test
public void loadContext() throws Exception {}
}
我在这个项目中没有其他代码。运行测试时,出现以下错误:
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
如您所见,我已在SpringBootApplication
注释中正确插入了exclude
子句,以便停止springboot,尝试处理与Mongo的连接,如中所建议
我还注意到,在将依赖项添加到springbootstarterweb
的pom.xml
之后,我开始出现错误
如何禁止Spring Boot在启动时尝试自动连接到Mongo?同步版本的MongoDB驱动程序也存在同样的问题
---编辑---
我还尝试围绕async.MongoClient
对象构建包装器,方法如下:
public class MongoWrapper {
private final MongoClient mongo;
public MongoWrapper() {
mongo = MongoClients.create();
}
public MongoClient getMongo() {
return mongo;
}
}
相应地更改了配置
@Bean
public MongoWrapper mongo() {
return new MongoWrapper();
}
不幸的是,一切都没有改变。Spring Boot似乎也以这种方式拦截MongoClient
对象:(
非常感谢。您在自己的配置中有一个
MongoClient
bean,如果您排除了自动配置,这对我来说没有任何意义
我已经在您自己的配置中注释掉了
@Bean
定义,现在没有尝试连接到Mongo。我不确定我是否回答了您的问题,您可能正在寻找其他内容,但是如果您不想使用Mongo,请不要在您自己的配置中定义MongoClient
。这有助于我们禁用异步使用默认配置的MongoDB java驱动程序:
@EnableAutoConfiguration(exclude = {MongoReactiveAutoConfiguration.class})
可能
SpringBootTest
没有使用TxViewApplication
作为上下文的源,因为您在其他地方有另一个@SpringBootConfiguration
。如果您排除mongo,为什么要在同一类中定义MongoClient
?我发布的代码是项目中唯一的代码。我合并了启动应用程序的同一类中的e配置需要显示的代码较少。您的意思是我不需要在Spring配置中定义任何MongoClient类型的对象吗?@StephaneNicoll,您建议如何将MongoDB的异步java驱动程序与Spring Boot集成?如果您排除自动配置,那么我们使用t尝试在启动时连接。您可以共享一个示例吗?@StephaneNicoll我在上共享了一个演示项目。pom.xml
是使用Spring Initializer生成的。然后我将依赖项添加到mongo异步驱动程序。如果您尝试运行DemoApplicationTests
,您将能够复制错误。非常感谢。我确实想使用mongo!但我确实想使用我不想让Spring Boot为我处理与它的连接。那么你是说我不能使用Spring依赖项注入机制来构建一个MongoClient
实例,而不让Spring Boot拦截它?Spring Boot没有任何作用。你创建这个bean定义的事实使它在启动时连接。Spring Boot不负责Mongo驱动程序文档声明,简单创建MongoClient并不会强制db连接。您如何解释?哦,如果Mongo文档声明,这一定是Spring Boot的错误?看看调用堆栈,没有一个元素与Spring相关。用以下代码替换main,您会发现ve异常:publicstaticvoidmain(String[]args)抛出IOException{MongoClient MongoClient=MongoClients.create();System.in.read();}
我将尝试询问MongoDB用户发生了什么。非常感谢您的耐心。
@EnableAutoConfiguration(exclude = {MongoReactiveAutoConfiguration.class})