Spring tomcat中的多上下文加载程序定义错误

Spring tomcat中的多上下文加载程序定义错误,spring,spring-boot,spring-mvc,servletcontextlistener,Spring,Spring Boot,Spring Mvc,Servletcontextlistener,我有一个ApplicationInitializer类,它实现了WebApplicationInitializer,并在其中添加了我自己的ContextLoaderListener。当我在STS中运行我的应用程序时,它运行得很好,但当我尝试在tomcat中部署war文件时,应用程序没有部署,并出现以下多上下文侦听器错误: 10-Oct-2019 10:51:58.252 INFO [Catalina-utility-2] org.apache.catalina.core.ApplicationC

我有一个ApplicationInitializer类,它实现了WebApplicationInitializer,并在其中添加了我自己的ContextLoaderListener。当我在STS中运行我的应用程序时,它运行得很好,但当我尝试在tomcat中部署war文件时,应用程序没有部署,并出现以下多上下文侦听器错误:

10-Oct-2019 10:51:58.252 INFO [Catalina-utility-2] org.apache.catalina.core.ApplicationContext.log 3 Spring WebApplicationInitializers detected on classpath
10-Oct-2019 10:52:05.987 INFO [Catalina-utility-2] org.apache.catalina.core.ApplicationContext.log Initializing Spring embedded WebApplicationContext
10-Oct-2019 10:52:11.237 SEVERE [Catalina-utility-2] 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!
        at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:262)
        at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4683)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5146)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:978)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1849)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
        at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:118)
        at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:773)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:427)
        at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1620)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:305)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
        at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1151)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1353)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1357)
        at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1335)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
        at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
        at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.base/java.lang.Thread.run(Thread.java:835)
10-Oct-2019 10:52:11.240 INFO [Catalina-utility-2] org.apache.catalina.core.ApplicationContext.log Closing Spring root WebApplicationContext

我阅读了以下文件:

据我所知,我可以完全删除AppInitializer类,并将其内容添加到spring boot应用程序类中。然后,我查看了SpringBootServletInitializer的启动过程,并将代码更改为:

@springboot应用程序
@EntityScan(“com.example”)
@EnableJParepositions(“com.example”)
@组件扫描(“com.example”)
@EnableConfigurationProperties(CustomProperties.class)
公共类应用程序扩展了SpringBootServletInitializer{
@凌驾
受保护的SpringApplicationBuilder配置(SpringApplicationBuilder应用程序){
返回应用程序.sources(application.class);
}
@凌驾
启动时公共void(最终ServletContext sc)引发ServletException{
AnnotationConfigWebApplicationContext root=新的AnnotationConfigWebApplicationContext();
root.scan(“com.example”);
sc.addListener(新的ContextLoaderListener(根目录){
@凌驾
公共void contextInitialized(ServletContextEvent事件){
//没有操作,因为应用程序上下文已初始化
}
});
ServletRegistration.DynamicAppServlet=sc.addServlet(“mvc”,新DispatcherServlet(新的GenericWebApplicationContext());
appServlet.setLoadOnStartup(1);
appServlet.addMapping(“/”);
sc.addFilter(“securityFilter”,新的DelegatingFilterProxy(“springSecurityFilterChain”))
.addMappingForUrlPatterns(null,false,“/*”);
}
公共静态void main(字符串[]args){
SpringApplication.run(Application.class,args);
}
}
这次war文件正常部署,但当我尝试点击主页时,我得到了以下错误,尽管我添加了springSecurityFilterChain:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'springSecurityFilterChain' available
    org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:771)
    org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1221)
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:294)
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204)
    org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1111)
    org.springframework.web.filter.DelegatingFilterProxy.initDelegate(DelegatingFilterProxy.java:337)
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:263)
这是我最初的课程(两个独立的课程):

公共类AppInitializer实现WebApplicationInitializer{
@凌驾
启动时公共void(最终ServletContext sc)引发ServletException{
AnnotationConfigWebApplicationContext root=新的AnnotationConfigWebApplicationContext();
root.scan(“com.example”);
sc.addListener(新的ContextLoaderListener(根));
ServletRegistration.DynamicAppServlet=sc.addServlet(“mvc”,新DispatcherServlet(新的GenericWebApplicationContext());
appServlet.setLoadOnStartup(1);
appServlet.addMapping(“/”);
sc.addFilter(“securityFilter”,新的DelegatingFilterProxy(“springSecurityFilterChain”))
.addMappingForUrlPatterns(null,false,“/*”);
}
}
@springboot应用程序
@EntityScan(“com.example”)
@EnableJParepositions(“com.example”)
@组件扫描(“com.example”)
@EnableConfigurationProperties(CustomProperties.class)
公共类应用程序扩展了SpringBootServletInitializer{
@凌驾
受保护的SpringApplicationBuilder配置(SpringApplicationBuilder应用程序){
返回应用程序.sources(application.class);
}
公共静态void main(字符串[]args){
SpringApplication.run(Application.class,args);
}
}

请帮我找出我做错了什么。

我建议读一读你们所指的。如前所述,您只需实现
configure
方法。Spring Boot将处理所有其他事情。我确实实现了文档中解释的配置方法,但它仍然不起作用。你没有按照你发布的内容进行操作。您在启动时覆盖了不是
configure
方法的
onStartup
,而在您的最后一个代码片段中,它完全丢失了。不,我的意思是,我只是在看到您的回复后添加了它,并对其进行了测试,但它不起作用,我将更新我的初始帖子。确保您的
应用程序
类位于根包
com中。例如
,这样您就可以删除
@EntityScan
@ComponentScan
@EnableJpaRepositories
,因为Spring Boot将自动检测并启用它们。还要确保类路径中有Spring安全性。记住,你唯一需要的就是上一节课的代码。没有
onStartup
方法,也没有注册为您完成的
DelegatingFilterProxy
的任何其他方法。如果没有发生这种情况,您正在代码/配置中执行禁用Spring安全性的操作。