#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. Позвольте мне проверить , чтобы запустить оба .