2017-08-30 79 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> { 

}