@Profile导致无法启动EmbeddedWebApplicationContext

时间:2014-09-09 13:35:59

标签: spring spring-boot spring-java-config

我试图使用@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时,一切都有效,但是我的测试是使用生产数据库; )

1 个答案:

答案 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.propertiesapplication-test.properties,您可以将其放在src/test/resources中。