Spring Boot 1.3.0创建了多个ContextLoader定义

时间:2015-11-18 15:24:15

标签: spring-boot tomcat8

我有一个使用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;我代码中的任何地方。 (即使我有,结果也一样。)

2 个答案:

答案 0 :(得分:1)

听起来你正在点击this bug。您可以通过将@Order(Ordered.HIGHEST_PRECEDENCE)添加到ExampleApplication来解决此问题,以便它在Jersey的SpringWebApplicationInitializer之前运行,因此有机会将其关闭。

答案 1 :(得分:0)

实际上这是我的坏事。我对spring-boot-starter-jersey有了额外的依赖,它创建了自己的ContextLoader。