У меня возникли проблемы с использованием Spring Boot и внешнего драйвера MongoDB. Я не могу использовать проект Spring Data MongoDB, потому что мне нужно использовать ufficial асинхронный драйвер, данный Mongo. Тем не менее, мне нужно использовать Spring Boot, потому что модуль, который я разрабатываю, является частью более крупного проекта, использующего эту библиотеку.Spring Boot Starter-Web пытается подключиться к Mongo при запуске
Это мой 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>
Подробно, я использую Spring Boot 1.4.1 и Mongo Async Driver 3.2.2.
Это мое приложение.
@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);
}
}
Это единственное (пустое) испытание, которое у меня есть на данный момент.
@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
для того, чтобы остановить Spring бутс, чтобы попытаться справиться с его собственного подключением к Монго , как предложено в Mongo tries to connect automatically to port 27017(localhost).
Я также заметил, что у меня появилась ошибка после добавления к pom.xml
зависимости от spring-boot-starter-web
.
Как я могу заблокировать Spring Boot, чтобы попытаться автоматически подключиться к Mongo при запуске? Та же проблема присутствует в синхронной версии драйвера MongoDB.
--- EDIT ---
Я также пытаюсь построить обертки вокруг 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 Загрузочный кажется перехватить MongoClient
объект также таким образом :(
Большое спасибо.
Возможно, 'SpringBootTest' не использует' TxViewApplication' как источник контекста, потому что у вас есть другая '@ SpringBootConfiguration' где-то в другом месте. Если вы исключаете монго, почему вы определяете «MongoClient» в том же классе? –
Код, который я опубликовал, является единственным в проекте.Я объединил конфигурацию в том же классе, который запускает приложение, чтобы показывать меньше кода. Вы имели в виду, что мне не нужно определять какой-либо объект типа MongoClient в конфигурации Spring? –
@StephaneNicoll, как вы предлагаете интегрировать драйвер async java MongoDB с Spring Boot? –