2016-11-22 3 views
1

У меня возникли проблемы с использованием 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 объект также таким образом :(

Большое спасибо.

+0

Возможно, 'SpringBootTest' не использует' TxViewApplication' как источник контекста, потому что у вас есть другая '@ SpringBootConfiguration' где-то в другом месте. Если вы исключаете монго, почему вы определяете «MongoClient» в том же классе? –

+0

Код, который я опубликовал, является единственным в проекте.Я объединил конфигурацию в том же классе, который запускает приложение, чтобы показывать меньше кода. Вы имели в виду, что мне не нужно определять какой-либо объект типа MongoClient в конфигурации Spring? –

+0

@StephaneNicoll, как вы предлагаете интегрировать драйвер async java MongoDB с Spring Boot? –

ответ

0

У вас есть MongoClient компонента в вашей собственной конфигурации, которая не имеет никакого смысла для меня, если вы исключили авто -configuration.

Я прокомментировал определение @Bean в вашей собственной конфигурации, и никакая попытка подключения к Mongo не выполняется. Я не уверен, что я отвечаю на ваш вопрос, и вы, вероятно, ищете что-то еще, но если вы не хотите использовать монго, не определяйте MongoClient в вашей собственной конфигурации!

+0

Я НЕ хочу использовать Mongo! Но я НЕ хочу, чтобы Spring Boot подключался к нему для меня. Тогда вы говорите, что я не могу использовать механизмы инъекций Spring для создания экземпляра «MongoClient» без перегрузки Spring Boot? –

+0

Весенний ботинок ничего не делает. Тот факт, что вы создаете это определение бина, позволяет подключиться при запуске. Spring Boot не несет ответственности за это вообще. –

+0

В документации для водителей Mongo указано, что простое создание MongoClient не связано с подключением db. Как вы это объясните? –

Смежные вопросы