java.lang.IllegalStateException: 无法初始化上下文,因为已经存在根应用程序上下文
java.lang.IllegalStateException: Cannot initialize context because there is already a root application context present
当 运行 我的 web 应用程序时,我每隔一次尝试都会得到下面列出的堆栈跟踪。请注意,据我所知,im web.xml 似乎没有多个 ContextLoader 定义。此外,该应用程序运行良好 second/fourth/etc。时间。与它根本不起作用相比,这种行为更难调试。任何人都可以阐明这一点吗?
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:299)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4795)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5221)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:724)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:700)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:714)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:919)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1703)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
对于有类似问题的任何人 - 事实证明,项目中使用的 spring-jersey 正在设置自己的上下文。我的上下文和 spring-jersey 显然是按随机顺序初始化的。
更多信息在这里:
https://java.net/jira/browse/JERSEY-2038
https://java.net/projects/jersey/lists/users/archive/2014-03/message/124
建议添加的解决方案:
servletContext.setInitParameter("contextConfigLocation", "<NONE>");
由于初始化顺序,WebAppInitializer 实现无法可靠地工作。解决问题的方法是添加其 xml 等价物:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</context-param>
作为web.xml中的第一个参数,确保在上下文初始化之前设置它。
如果您正在使用 spring boot
,请确保您没有这样做
container.addListener(new ContextLoaderListener(rootContext));
当 运行 我的 web 应用程序时,我每隔一次尝试都会得到下面列出的堆栈跟踪。请注意,据我所知,im web.xml 似乎没有多个 ContextLoader 定义。此外,该应用程序运行良好 second/fourth/etc。时间。与它根本不起作用相比,这种行为更难调试。任何人都可以阐明这一点吗?
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:299)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4795)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5221)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:724)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:700)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:714)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:919)
at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1703)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
对于有类似问题的任何人 - 事实证明,项目中使用的 spring-jersey 正在设置自己的上下文。我的上下文和 spring-jersey 显然是按随机顺序初始化的。
更多信息在这里:
https://java.net/jira/browse/JERSEY-2038
https://java.net/projects/jersey/lists/users/archive/2014-03/message/124
建议添加的解决方案:
servletContext.setInitParameter("contextConfigLocation", "<NONE>");
由于初始化顺序,WebAppInitializer 实现无法可靠地工作。解决问题的方法是添加其 xml 等价物:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</context-param>
作为web.xml中的第一个参数,确保在上下文初始化之前设置它。
如果您正在使用 spring boot
,请确保您没有这样做 container.addListener(new ContextLoaderListener(rootContext));