Контекст приложения загружается дважды-Spring Boot

у меня довольно простая настройка. Проект maven с 3 модулями: 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);
    }
}

и несколько классов в модуле core / model. Моя точка приложения-контейнера:

public class AbcdXml extends SpringBootServletInitializer {

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

}

и нет интернета.в XML! Pom моей модели имеет следующую зависимость, связанную с весенней загрузкой:

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

ядра пом.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>

теперь работает WebappConfig через Run as - > Java-приложение работает отлично, но мне нужно развернуть проект как войну на tomcat7. Упаковка Webapp-это война. В lib нет tomcat, предоставленного jar, кроме tomcat-jdbc и tomcat-tuli jar(не должно быть проблемой?).

когда я развертываю свой abcd.война, 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: 'hiddenHttpMethodFilter' 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)

нет интернета.XML как я упоминал ранее.

несколько интересных вещей, которые я не могу понять, почему :

  1. после взрыва войны tomcat каким-то образом создает корневую папку с веб-сайтом по умолчанию.xml[должно быть неправильной конфигурацией Spring boot. Как я могу это исправить? Указатели, пожалуйста?]
  2. даже если я возвращаю то же самое "приложение" SpringApplicationBuilder в AbcdXml.java, я сталкиваюсь с той же проблемой applicationcontext загружается дважды.

Спасибо за вашу помощь!

EDIT 1:

содержание веб.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/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd" version="2.5">
</web-app>

4 ответов


Если ваше приложение включает Джерси-spring3, и вы не предпринимаете шагов для отключения, он попытается создать ApplicationContext для вас (полезно, не). Существует способ отключить его (в WebApplicationInitializer):

servletContext.setInitParameter("contextConfigLocation", "<NONE>");

или просто используйте это:https://github.com/dsyer/spring-boot-jersey (включить как зависимость).


в моем случае виновник использовал Spring Boot 1.3.0.M4, вместе с Джерси 2.21. Когда я понизил Spring Boot до 1.2.6.Выпуск вопрос ушел. Единственное, что мне нужно было сделать, это явно переопределить следующие свойства, так как мне нужна поддержка spring 4.2.0 для Hibernate 5 и jackson 2.6.2 для JSR310 (java8 java.время) поддержка:

<spring.version>4.2.0.RELEASE</spring.version>
<jackson.version>2.6.2</jackson.version>

EDIT: начиная с spring-boot 1.3.0.Отпустите, эта ошибка все еще существует. См.github


в моем случае - у меня была та же проблема - видеть весну splash screen дважды-это было потому, что у меня было 2 класса, которые расширились SpringBootServletInitializer. Один назывался SpringBootWebApplication и другие ServletInitializer. Я просто удалил ServletInitializer и он работал нормально. Не знаю, почему было 2 класса-может быть, потому, что я получил вдохновение от 2 разных примеров, чтобы собрать то, что мне нужно.


@EnableAutoConfiuguration из API говорит: "включите автоматическую настройку контекста приложения Spring, пытаясь угадать и настроить компоненты, которые вам, вероятно, понадобятся."

@ComponentScan также будет инстанцировать бобы. Он будет сканировать пакеты, находить и регистрировать бобы.

поскольку вы используете обе эти аннотации, я думаю, поэтому его загрузка дважды.