2017-08-30 18 views
1

我想知道,有沒有任何例子如何正確配置嵌入式MongoDBSpring Boot最簡單的方法來配置嵌入式MongoDB

例如,我這是怎麼配置H2嵌入式數據庫:

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.Profile; 
import org.springframework.context.annotation.PropertySource; 
import org.springframework.core.env.Environment; 
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; 
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; 
import org.springframework.jndi.JndiObjectFactoryBean; 

import javax.sql.DataSource; 


@Configuration 
@PropertySource({"configs/datasource.properties"}) 
public class DataSourceConfig { 

    @Bean 
    @Profile("test") 
    public DataSource testDataSource() { 
     return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build(); 
    } 
} 

而這個效果很好,但有一個問題。這種方法不會爲MongoDB提供配置。

是否有任何解決方法?

UPDATE 1:

[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.5.6.RELEASE:run (default-cli) on project XXX: An exception occurred while running. null: InvocationTargetException: Error creating bean with name 'mongoTemplate' defined in class path resource [com/reborn/XXX/config/DataSourceConfig .class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframewor k.data.mongodb.core.MongoTemplate]: Factory method 'mongoTemplate' threw exception; nested exception is java.lang.NoClassDefFoundError: de/flapdoodle/embed/mongo/distribu tion/IFeatureAwareVersion: de.flapdoodle.embed.mongo.distribution.IFeatureAwareVersion -> [Help 1]

更新2:

的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> 

    <groupId>com.reborn</groupId> 
    <artifactId>xxx</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>xxx</name> 
    <description>Demo project for Spring Boot</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.5.6.RELEASE</version> 
     <relativePath/> <!-- lookup parent from repositories --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-mongodb</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>de.flapdoodle.embed</groupId> 
      <artifactId>de.flapdoodle.embed.mongo</artifactId> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>cz.jirutka.spring</groupId> 
      <artifactId>embedmongo-spring</artifactId> 
      <version>1.3.1</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

</project> 

DatasourceConfig:

package com.reborn.xxx.config; 

import com.mongodb.MongoClient; 
import cz.jirutka.spring.embedmongo.EmbeddedMongoFactoryBean; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.data.mongodb.core.MongoTemplate; 

import java.io.IOException; 

@Configuration 
public class DataSourceConfig { 

    @Bean 
    public MongoTemplate mongoTemplate() throws IOException { 
     EmbeddedMongoFactoryBean mongo = new EmbeddedMongoFactoryBean(); 
     mongo.setBindIp("localhost"); 
     MongoClient mongoClient = mongo.getObject(); 
     MongoTemplate mongoTemplate = new MongoTemplate(mongoClient, "abcd"); 
     return mongoTemplate; 
    } 

} 

更新3:

[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.5.6.RELEASE:run (default-cli) on project starbucks-finder: An exception occurred while running. null: InvocationTargetException: Error creating bean with name 'mongoTemplate' defined in class path resource [com/reborn/xxx/config/DataSourceConfig .class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframewor k.data.mongodb.core.MongoTemplate]: Factory method 'mongoTemplate' threw exception; nested exception is java.lang.IllegalArgumentException: this version does not support 32Bit: PRODUCTION:Windows:B32 -> [Help 1]

+1

的可能的複製[如何在Spring Boot應用程序中配置Embedded MongDB進行集成測試?](https://stackoverflow.com/questions/31568351/how-do-you-configure-embedded-mongdb-for-integrati彈簧啓動測試-ap) – vahdet

回答

2

flapdoodle embedded MongoDB可以使用Spring引導相結合。

  • 聲明上夢話的依賴:

    <dependency> 
        <groupId>de.flapdoodle.embed</groupId> 
        <artifactId>de.flapdoodle.embed.mongo</artifactId> 
        <version>2.0.0</version> 
    </dependency> 
    
  • 聲明對圖書館的依賴,提供夢話的嵌入式MongoDB的一個Spring工廠bean:

    <dependency> 
        <groupId>cz.jirutka.spring</groupId> 
        <artifactId>embedmongo-spring</artifactId> 
        <version>1.3.1</version> 
    </dependency> 
    
  • 想必,你已經宣佈對spring-boot-starter-data-mongodb的依賴:

    <dependency> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-data-mongodb</artifactId> 
    </dependency> 
    
  • 現在,只需在嵌入式MongoDB實例配置MongoTemplate指點:

    @Bean 
    public MongoTemplate mongoTemplate() throws IOException { 
        EmbeddedMongoFactoryBean mongo = new EmbeddedMongoFactoryBean(); 
        mongo.setBindIp("localhost"); 
        MongoClient mongoClient = mongo.getObject(); 
        MongoTemplate mongoTemplate = new MongoTemplate(mongoClient, "test_or_whatever_you_want_to_call_this_db"); 
        return mongoTemplate; 
    } 
    
+0

項目啓動有一些問題。請參閱主題更新。 – Reborn

+0

@Reborn您是否說過您更新了原始問題以描述「項目啓動時的一些問題」?如果是這樣,我看不到任何**細節**描述這個問題。也許你可以[提供一個MCVE](https://stackoverflow.com/help/mcve)? – glytching

+0

對不起,編輯花了太長時間。 – Reborn

0

它會自動配置相關的依賴性的新的或compitable版本

<parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.5.6.RELEASE</version> 
     <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 


<dependency> 
      <groupId>de.flapdoodle.embed</groupId> 
      <artifactId>de.flapdoodle.embed.mongo</artifactId> 
      <version>1.50.5</version> 
     </dependency> 
     <dependency> 
      <groupId>cz.jirutka.spring</groupId> 
      <artifactId>embedmongo-spring</artifactId> 
      <version>RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-mongodb</artifactId> 
     </dependency> 

    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 


     @Repository 
public interface yourRepository extends MongoRepository<Class Type, String> { 

} 
相關問題