2016-11-22 1 views
1

스프링 부트 및 MongoDB 외장 드라이버를 사용할 때 몇 가지 문제가 발생합니다. Mongo가 제공 한 비공식 비동기 드라이버를 사용해야하기 때문에 Spring Data MongoDB 프로젝트를 사용할 수 없습니다. 그러나 개발중인 모듈이이 라이브러리를 사용하는 더 큰 프로젝트의 일부이기 때문에 Spring Boot를 사용해야합니다.스프링 부트 스타터 - 웹이 시작시 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 조항을 삽입 한 : 나는 테스트를 실행했을 때, 나는 다음과 같은 오류가 Mongo tries to connect automatically to port 27017(localhost)에 나와 있습니다.

나는 또한 spring-boot-starter-web에 대한 의존성이있는 pom.xml에 추가 된 후에 오류가 발생하기 시작했습니다.

시동시 Mongo에 자동으로 연결되도록 Spring Boot를 어떻게 금지 할 수 있습니까? 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(); 
} 

불행히도, 아무것도 변경되지 않았습니다. 봄 부팅

덕분에이 방법 :(도 많이를 MongoClient 객체를 가로 챌 것 같다.

+0

어쩌면'SpringBootTest'는 다른'@ SpringBootConfiguration'을 가지고 있기 때문에'TxViewApplication'을 컨텍스트의 소스로 사용하지 않을 것입니다. mongo를 제외하면 왜 같은 클래스에서'MongoClient'를 정의합니까? –

+0

내가 게시 한 코드는 프로젝트에있는 유일한 코드입니다.표시 할 코드가 적도록 응용 프로그램을 시작하는 동일한 클래스의 구성을 병합했습니다. Spring 구성에서 MongoClient 유형의 객체를 정의 할 필요가 없다는 것을 의미합니까? –

+0

@StephaneNicoll, MongoDB의 async java 드라이버를 Spring Boot와 어떻게 통합 할 것을 제안합니까? –

답변

0

당신이 자동차를 제외한 경우 나에게 어떤 이해가되지 않습니다 자신의 구성에서 MongoClient 콩이 -configuration.

나는 자신의 설정에서 @Bean 정의를 주석 처리했으며 Mongo에 연결하려는 시도는 지금 수행되지 않습니다. 귀하의 질문에 답변 할 수 있을지 모르지만 아마도 다른 것을 찾고있을 것입니다. 그렇다면 몽고를 사용하고 싶지 않다면, 자신의 설정으로 MongoClient을 정의하지 마십시오!

+0

을 호출 할 때 Mongo를 사용하고 싶습니다! 하지만 스프링 부트가 나를 위해 연결을 처리하는 것을 원하지 않습니다. 그렇다면 스프링 부트가 인터셉트하지 않고'MongoClient' 인스턴스를 빌드하기 위해 스프링 의존성 주입 메커니즘을 사용할 수 없다는 말입니까? –

+0

스프링 부트는 아무 것도하지 않습니다. 이 bean 정의를 작성하면 시작시 연결됩니다. Spring Boot는 그 일을 전혀 책임지지 않습니다. –

+0

Mongo 드라이버 문서는 MongoClient의 단순 작성이 db 연결을 강제 실행하지 않는다고 설명합니다. 어떻게 설명하니? –

관련 문제