我有一个使用Spring Boot 1.3.0.RELEASE的应用程序。
支持生产版本在Tomcat服务器(AWS Elastic Beanstalk)上运行。 大多数情况下,当我部署应用程序时,出现错误:
18-Nov-2015 14:40:30.301 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Spring WebApplicationInitializers detected on classpath: [org.glassfish.jersey.server.spring.SpringWebApplicationInitializer@16a15bdb, com.example.ExampleApplication@529635d6, org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration@19b5e8a2]
18-Nov-2015 14:40:37.851 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Initializing Spring embedded WebApplicationContext
18-Nov-2015 14:40:49.148 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
java.lang.IllegalStateException: Cannot initialize context because there is already a root application context present - check whether you have multiple ContextLoader* definitions in your web.xml!
作为Spring Boot应用程序,我甚至没有web.xml
。
我的ExampleApplication
看起来像是:
@SpringBootApplication(exclude = JerseyAutoConfiguration.class)
@EnableHypermediaSupport(type = EnableHypermediaSupport.HypermediaType.HAL)
public class ExampleApplication extends SpringBootServletInitializer {
private static final Class<ExampleApplication> APPLICATION_CLASS = ExampleApplication.class;
public static void main(final String[] args) {
SpringApplication.run(APPLICATION_CLASS, args);
}
@Override
protected SpringApplicationBuilder configure(final SpringApplicationBuilder application) {
return application.sources(APPLICATION_CLASS);
}
@Override
public void onStartup(final ServletContext servletContext) throws ServletException {
servletContext.setInitParameter("contextConfigLocation", "<NONE>");
super.onStartup(servletContext);
}
//...
}
我读过servletContext.setInitParameter("contextConfigLocation", "<NONE>");
可能会有所帮助,所以我已经补充说,但它没有。
我认为排除JerseyAutoConfiguration
会有所帮助,但它没有。
使用spring-build:run
maven目标运行应用程序时没有任何问题,或直接从命令行运行程序包。
我没有`@ EnableWebMVC&#39;我代码中的任何地方。 (即使我有,结果也一样。)
答案 0 :(得分:1)
听起来你正在点击this bug。您可以通过将@Order(Ordered.HIGHEST_PRECEDENCE)
添加到ExampleApplication
来解决此问题,以便它在Jersey的SpringWebApplicationInitializer
之前运行,因此有机会将其关闭。
答案 1 :(得分:0)
实际上这是我的坏事。我对spring-boot-starter-jersey
有了额外的依赖,它创建了自己的ContextLoader。