程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了应用程序上下文被加载两次-Spring Boot大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决应用程序上下文被加载两次-Spring Boot?

开发过程中遇到应用程序上下文被加载两次-Spring Boot的问题如何解决?下面主要结合日常开发的经验,给出你关于应用程序上下文被加载两次-Spring Boot的解决方法建议,希望对你解决应用程序上下文被加载两次-Spring Boot有所启发或帮助;

如果您的应用包含jersey- spring3,并且您没有采取措施禁用它,它将尝试ApplicationContext为您创建一个(有用的,不是)。有一种方法可以将其关闭(在中WebApplicationInitializer):

servletContext.seTinitParameter("contextConfigLOCATIOn", "<NONE>");

或者只是使用它:https ://github.com/dsyer/spring-boot-jersey(包含为依赖项)。

解决方法

我有一个相当简单的设置。一个包含3个模块的Maven项目:core / webapp / model。我正在使用Spring
Boot来完善我的应用程序。在webapp中,我有一个简单的WebappConfig类,如下所示:

@Configuration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = @ComponentScan.Filter(Configuration.class))
public class WebappConfig {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(WebappConfig.class);
        app.setAdditionalProfiles("dev");
        app.run(args);
    }
}

核心/模型模块中的类很少。我的容器应用点是:

public class AbcdXml extends SpringBootServleTinitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(WebappConfig.class);
    }

}

而且没有web.xml!我模型的pom具有以下与spring boot相关的依赖关系:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

核心的pom.xml:

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-batch</artifactId>
</dependency>

现在,通过“运行方式->
Java应用程序”运行WebappConfig可以很好地运行,但是我需要在tomcat7上部署该项目。Webapp的包装就是战争。除了tomcat-
jdbc和tomcat-tuli jar外,lib中没有提供tomcat的jar(应该没有问题吗?)。

当我部署abcd.war时,applicationcontext被加载两次,并导致以下错误stracktrace:

2014-06-27 11:06:08.445  INFO 23467 --- [ost-startStop-1] o.a.c.c.C.[.[localhost].[/abcd]        : Initializing Spring embedded WebApplicationContext
2014-06-27 11:06:08.446  INFO 23467 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 19046 ms
2014-06-27 11:06:21.308  INFO 23467 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2014-06-27 11:06:21.313  INFO 23467 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'errorPageFilter' to: [/*]
2014-06-27 11:06:21.314  INFO 23467 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenhttpR_446_11845@ethodFilter' to: [/*]
2014-06-27 11:06:26.073  INFO 23467 --- [ost-startStop-1] j.LocalContainerEntitymanagerFactoryBean : Building JPA container EntitymanagerFactory for persistence unit 'default'
2014-06-27 11:06:26.127  INFO 23467 --- [ost-startStop-1] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUniTinfo [
    name: default
    ...]
2014-06-27 11:06:26.511  INFO 23467 --- [ost-startStop-1] org.hibernate.Version                    : HHH000412: Hibernate Core {4.3.1.Final}
2014-06-27 11:06:26.521  INFO 23467 --- [ost-startStop-1] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2014-06-27 11:06:26.527  INFO 23467 --- [ost-startStop-1] org.hibernate.cfg.Environment            : HHH000021: Bytecode provider name : javassist
//some info messages from spring boot
2014-06-27 11:07:31.664  INFO 23467 --- [ost-startStop-1] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.resourcehttprequestHandler]
2014-06-27 11:07:33.095  INFO 23467 --- [ost-startStop-1] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.resourcehttprequestHandler]
2014-06-27 11:07:33.096  INFO 23467 --- [ost-startStop-1] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.resourcehttprequestHandler]
2014-06-27 11:07:36.080  INFO 23467 --- [ost-startStop-1] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2014-06-27 11:08:49.583  INFO 23467 --- [ost-startStop-1] o.s.boot.SpringApplication               : Started application in 183.152 seconds (JVM running for 210.258)
2014-06-27 11:12:29.229 ERROR 23467 --- [ost-startStop-1] o.a.c.c.C.[.[localhost].[/abcd]        : 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:277)
    at org.springframework.web.context.ContextLoaderListener.contexTinitialized(ContextLoaderListener.java:106)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4937)
    at org.apache.catalina.core.StandardContext.starTinternal(StandardContext.java:5434)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:976)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1653)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

正如我前面提到的,没有web.xml。

我无法弄清为什么一些有趣的事情:

  1. 战争爆发后,tomcat以某种方式用默认的web.xml创建了一个ROOT文件夹[必须是Spring boot misconfiguration。我该如何纠正?请问指针?]
  2. 即使我在AbcdXml.java中返回相同的“应用程序” SpringApplicationBuilder,我也面临相同的applicationcontext加载两次的问题。

谢谢你的帮助!

编辑1:

ROOT文件夹中生成的web.xml的内容:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLscheR_446_11845@a-instance" xsi:scheR_446_11845@aLOCATIOn="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd" version="2.5">
</web-app>

大佬总结

以上是大佬教程为你收集整理的应用程序上下文被加载两次-Spring Boot全部内容,希望文章能够帮你解决应用程序上下文被加载两次-Spring Boot所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。