flapdoodle.embed.mongo всегда запускается с основным приложением Spring Boot в Eclipse, как удалить

#java #spring #mongodb #spring-boot

#java #spring #mongodb #spring-boot

Вопрос:

У меня проблема. Простое приложение spring boot отлично работает с существующей конфигурацией MongoDB. Для интеграционного теста я добавил необходимую конфигурацию для встроенного mongodb с конфигурацией flapdoodle. Все модульные тесты выполняются правильно. Когда я запускаю основное приложение Spring Boot, оно по умолчанию учитывает встроенную конфигурацию mongodb в flapdoodle. В результате встроенный mongodb никогда не завершается, и во время выполнения тестовых примеров junit он все еще выполняется. Ниже я привожу фрагмент кода.

Всякий раз, когда я запускаю основное приложение Spring Boot, оно по-прежнему запускает встроенный mongodb. Я всегда вижу следующие строки в консоли.

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

Я предоставляю код для конфигурации Mongodb, который следует выбрать при запуске основного приложения Spring Boot.

 @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() amp;amp; 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();
    }

}
 

Для интеграционного тестирования у меня есть конфигурация для встроенного mongodb, которая является частью 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();
    }
}
 

Пожалуйста, помогите мне, как удалить эту встроенную конфигурацию mongo при запуске основного приложения Spring Boot в eclipse.

Я также предоставляю ниже свое основное приложение ниже.

 @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:

Я вижу код, который вы не добавили ни одного профиля в MongoConfiguration класс. Во время сборки eclipse этот класс также используется Spring framework. Добавьте следующие строки в этот класс, чтобы при запуске Spring Boot test этот класс был выбран, а при запуске основного приложения Spring Boot будет выбран фактический файл конфигурации Mongo. Вот почему Spring предлагает концептуальный профиль. Добавьте профиль соответствующим образом для другой среды.

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

Итак, окончательный код будет выглядеть так.

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

Комментарии:

1. Позвольте мне проверить , чтобы запустить оба .