簡體   English   中英

Spring Boot Starter-Web嘗試在啟動時連接到Mongo

[英]Spring Boot Starter-Web tries to connect to Mongo at startup

我在使用Spring Boot和MongoDB外部驅動程序時遇到了一些問題。 我不能使用Spring Data MongoDB項目,因為我需要使用Mongo給出的ufficial異步驅動程序。 但是,我需要使用Spring Boot,因為我正在開發的模塊是使用該庫的更大項目的一部分。

這是我的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 Boot嘗試處理自己與Mongo的連接,正如Mongo中建議的那樣, 嘗試自動連接到端口27017(localhost)

我還注意到,在添加到spring-boot-starter-web的依賴項的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})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM