我有一个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不要自动添加默认值。
答案 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
事件,因为此时上下文已初始化。