flapdoodle.embed.mongo gets always started with Spring Boot Main application in Eclipse, how to remove

Viewed 567

I have got a problem. A simple spring boot application works fine with existing MongoDB configuration. For integration test, I added required configuration for embeded mongodb with flapdoodle configuration. All the unit tests are getting executed properly. When I run the main Spring Boot application, it by default considers the flapdoodle embeded mongodb configuration. As a result, the embeded mongodb never exits and while running the junit test cases, it still runs. I provide below the code snippet.

Whenever I start Spring Boot main application, it still runs the embeded mongodb. I see always the following lines in the console.

Download PRODUCTION:Windows:B64 START
Download PRODUCTION:Windows:B64 DownloadSize: 231162327
Download PRODUCTION:Windows:B64 0% 1% 2% 3% 4% 5% 6% 7% 8% 

I provide the code for Mongodb configuration which should be picked up when running the main Spring Boot application.

@Slf4j
@Configuration
public class NoSQLAutoConfiguration {

    @Autowired
    private NoSQLEnvConfigProperties configProperties;

    /**
     * Morphia.
     *
     * @return the morphia
     */
    private Morphia morphia() {
        final Morphia morphia = new Morphia();
        morphia.mapPackage(DS_ENTITY_PKG_NAME);
        return morphia;
    }


    @Bean
    public Datastore datastore(@Autowired @Qualifier("dev") MongoClient mongoClient) {
        String dbName = configProperties.getDatabase();
        final Datastore datastore = morphia().createDatastore(mongoClient, dbName);
        datastore.ensureIndexes();

        return datastore;
    }

    /**
     * Mongo client.
     *
     * @return the mongo client
     */
    @Primary
    @Bean(name = "dev")
    public MongoClient mongoClient() {
        MongoClient mongoClient = null;
        String dbHost = configProperties.getHost();
        int dbPort = configProperties.getPort();
        String database = configProperties.getDatabase();
        log.debug("MongDB Host: {} - MongoDB Port: {}", dbHost, dbPort);
        List<ServerAddress> serverAddresses = new ArrayList<>();
        serverAddresses.add(new ServerAddress(dbHost, dbPort));
        MongoClientOptions options = getMongoOptions();
        String dbUserName = configProperties.getMongodbUsername();
        String encRawPwd = configProperties.getMongodbPassword();
        char[] dbPwd = null;
        try {
            dbPwd = Util.decode(encRawPwd).toCharArray();
        } catch (Exception ex) {
            // Ignore exception
            dbPwd = null;
        }
        Optional<String> userName = Optional.ofNullable(dbUserName);
        Optional<char[]> password = Optional.ofNullable(dbPwd);

        if (userName.isPresent() && password.isPresent()) {
            MongoCredential credential = MongoCredential.createCredential(dbUserName, database, dbPwd);
            List<MongoCredential> credentialList = new ArrayList<>();
            credentialList.add(credential);
            mongoClient = new MongoClient(serverAddresses, credentialList, options);
        } else {
            log.debug("Connecting to local Mongo DB");
            mongoClient = new MongoClient(dbHost, dbPort);
        }
        return mongoClient;
    }

    
    private MongoClientOptions getMongoOptions() {
        MongoClientOptions.Builder builder = MongoClientOptions.builder();
        builder.maxConnectionIdleTime(configProperties.getMongodbIdleConnection());
        builder.minConnectionsPerHost(configProperties.getMongodbMinConnection());
        builder.connectTimeout(configProperties.getMongodbConnectionTimeout());
        return builder.build();
    }

}

For integration testing, I have the configuration for embeded mongodb which is part of src/test.

@TestConfiguration
public class MongoConfiguration implements InitializingBean, DisposableBean {

    MongodExecutable executable;
    private static final String DBNAME = "embeded";
    private static final String DBHOST = "localhost";
    private static final int DBPORT = 27019;

    @Override
    public void afterPropertiesSet() throws Exception {
        IMongodConfig mongodConfig = new MongodConfigBuilder().version(Version.Main.PRODUCTION)
                .net(new Net(DBHOST, DBPORT, Network.localhostIsIPv6())).build();

        MongodStarter starter = MongodStarter.getDefaultInstance();
        executable = starter.prepare(mongodConfig);
        executable.start();
    }

    private Morphia morphia() {
        final Morphia morphia = new Morphia();
        morphia.mapPackage(DS_ENTITY_PKG_NAME);
        return morphia;
    }

    @Bean
    public Datastore datastore(@Autowired @Qualifier("test") MongoClient mongoClient) {
        
        final Datastore datastore = morphia().createDatastore(mongoClient, DBNAME);
        datastore.ensureIndexes();

        return datastore;
    }

    
    @Bean(name = "test")
    public MongoClient mongoClient() {
        return new MongoClient(DBHOST, DBPORT);
    }

    @Override
    public void destroy() throws Exception {
        executable.stop();
    }
}

Please help me how to remove this embeded mongo configuration while running Spring Boot main application in eclipse.

I also provide below my main application below.

@EnableAspectJAutoProxy
@EnableSwagger2
@SpringBootApplication(scanBasePackages = { "com.blr.app" })
public class ValidationApplication {

    /**
     * The main method. f
     * 
     * @param args the arguments
     */
    public static void main(String[] args) {
        SpringApplication.run(ValidationApplication.class, args);
    }

}
1 Answers

I see the code that you have not added any profile to MongoConfiguration class. During eclipse build, this class is also picked up by Spring framework. Add the below lines to this class so that while running Spring Boot test this class will be picked up and while running main Spring Boot app, the actual Mongo Configuration file will be picked up. That is why Spring comes up with concept Profile. Add the profile appropriately for different environment.

@Profile("test")
@ActiveProfiles("test")

So final code will look like this.

@Profile("test")
@ActiveProfiles("test")
@TestConfiguration
public class MongoConfiguration implements InitializingBean, DisposableBean {
   ...
   ...
}
Related