我试图使用@Profile功能来分离生产/开发环境配置和'测试'配置。但是当我将@Profile添加到我的配置类时,我得到了:
Exception in thread "main" org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:124)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:476)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:952)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:941)
at mypackage.configuration.PhoenixConfiguration.main(PhoenixConfiguration.java:26)
Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:174)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:147)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:121)
... 7 more
配置类如下所示:
@Configuration
@EnableAutoConfiguration
@ComponentScan("mypackage")
@EnableJpaRepositories(basePackages = "mypackage.repository")
@EntityScan(basePackages = "mypackage.phoenix.domain")
@PropertySource("classpath:properties/application-production.properties")
@EnableWebMvc
@Profile("production")
public class PhoenixConfiguration extends WebMvcConfigurerAdapter{
public static void main(String[] args) throws Exception {
SpringApplication.run(PhoenixConfiguration.class, args);
}
}
我试图在application-production.properties
中将活动配置文件设置为生产spring.profiles.active=production (with and without " )
或cmd命令:mvn spring-boot:run -Dspring.profiles.active=production
没有任何帮助。当我删除@Profile时,一切都有效,但是我的测试是使用生产数据库; )
答案 0 :(得分:2)
如果添加配置文件,则整个应用程序基本停止工作,因为您的主要入口点已注明@Profile
。
我建议你让Spring Boot在它看起来好像你正试图在Spring Boot上努力工作并且你正在制作的东西,imho,太复杂的时候做它的工作。
Spring Boot将自动检测Spring Data JPA以及您的类路径上有Spring Web的事实。因此,请移除@EnableJpaRepositories
和@EnableWebMvc
,不要让您的课程延长WebMvcConfigurerAdapter
。
默认情况下,Spring启动会为您加载application.properties
而不是放入属性,或者将它放在类路径或配置的根目录中。至少删除@PropertySource
,因为Spring Boot只会加载它。如果您想保留properties
路径,请添加spring.config.location
属性,然后指向您的properties
目录。
最后我可能还会将文件重命名为PhoenixApplication
,但这只是我。这应该会留下像
@Configuration
@EnableAutoConfiguration
@ComponentScan("mypackage")
@EntityScan(basePackages = "mypackage.phoenix.domain")
public class PhoenixApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(PhoenixApplication.class, args);
}
}
现在只需将您的生产配置放在application.properties
中,然后在src/test/resources
中添加另一个,以包含您的测试配置。在运行时,只有第一个可用,测试后者将覆盖第一个属性。
如果你真的想使用配置文件,我建议你反过来做,配置生产和覆盖测试。然后只需将@ActiveProfiles
添加到您的测试用例中。
@ActiveProfiles("test")
@SpringApplicationConfiguration(classes=PhoenixApplication.class)
public class YourTest {}
这将启动一项测试,该测试将加载默认application.properties
和application-test.properties
,您可以将其放在src/test/resources
中。