我正在尝试使用flapdoodle嵌入式mongo数据库('de.flapdoodle.embed:de.flapdoodle.embed.mongo') 用于本地手动测试我使用H2进行关系数据库测试的方式。我只希望嵌入式mongo在“本地”SPring配置文件下运行时启动,但我无法弄清楚如何实现它 - 它总是在任何配置文件下启动。
我已经尝试将@SpringBootApplication(exclude=EmbeddedMongoAutoConfiguration.class)
添加到我的应用程序中(以为我可以稍后将该autoconfig重新导入到单个配置文件中)但这似乎没有任何影响。
任何人都知道如何将它限制在一个配置文件中,这种方式在Eclipse和Gradle中运行时都能正常工作吗?
答案 0 :(得分:2)
我可以想到两种方式:
1-仅在maven或gradle中的特定配置文件中加载您的依赖关系
<强>的Maven 强>
<profiles>
<profile>
<id>local</id>
<dependencies>
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<version>2.0.4-SNAPSHOT</version>
</dependency>
</dependencies>
</profile>
</profiles>
<强>摇篮强>
if (project.hasProperty('local')) {
dependencies {
compile 'de.flapdoodle.embed:de.flapdoodle.embed.mongo:2.0.4-SNAPSHOT'
}
}
2-在课堂上使用@Profile和@Import
<强> LoadEmbeded.java 强>
@Profile(value = "local")
@Configuration
@Import(EmbeddedMongoAutoConfiguration.class)
public class LoadEmbeded {
}
希望它能给你一个关于它的想法
编辑1:
我测试了我的方法并做了一个非常简单的应用程序。它适用于@Profile
。这是我测试的。
@SpringBootApplication(exclude = EmbeddedMongoAutoConfiguration.class)
public class DemoApplication {
@Autowired
TestRepository repository;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
CommandLineRunner runner() {
return args -> {
System.out.println(repository.save(new Test()));
System.out.println(repository.findAll());
};
}
}
@Repository
interface TestRepository extends MongoRepository<Test, String> {
}
@Document
class Test {
@Id
private String id;
public String getId() {
return id;
}
public Test setId(String id) {
this.id = id;
return this;
}
@Override
public String toString() {
return new ToStringBuilder(this)
.append("id", id)
.toString();
}
}
@Configuration
@Profile("local")
@Import(EmbeddedMongoAutoConfiguration.class)
class Load {
}
application.properties
spring.profiles.active=local
当我将活动个人资料更改为本地之外的其他内容时,它会在启动时抛出异常并抱怨mongodb的连接。但是当我将它设置为本地时,它会工作并向我显示已保存测试实体的ID。
如果您遇到同样的问题,可能有一个依赖项会再次加载Embedded MongoDB,即使您将其排除。通常它应该与测试依赖关系。检查您的依赖项。