"多个ContextLoader *定义错误"使用我自己的自定义ContextLoaderListener时发生

时间:2016-12-01 14:35:19

标签: java spring spring-boot

我有一个spring boot应用程序,并使用嵌入式jetty容器,没有web.xml文件。 我有一个自定义ContextLoaderLister类,它是默认Spring ContextLoaderListener的子类:

public class MyContextListener extends org.springframework.web.context.ContextLoaderListener

并将其注册如下:

@Configuration
public class ApplicationConfiguration {
  @Bean
  public ServletContextListener listener(){
    return new ContextDestroyListener();
  }
}

但是在启动容器时,会出现以下错误:

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!

我只想使用自定义ContextLoaderListener,而不是默认的ContextLoaderListener。但得到这个错误。当我使用@Bean注释注册ContextLoaderListener时,似乎仍在使用默认Spring ContextLoaderListener,因此它们在ContextLoader中为ApplicationContext,导致此错误。 我想知道我该怎么做,如果我想注册我自己的ContextLoaderListener,让Sprint不要自动添加默认值。

1 个答案:

答案 0 :(得分:0)

您可以使配置扩展SpringBootServletInitializer,然后覆盖onStartup方法:

public class MyApplication extends SpringBootServletInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        super.onStartup(servletContext);
        servletContext.addListener(new MyContextListener());
    }

}

请注意,此侦听器不会获取contextInitialized事件,因为此时上下文已初始化。