Contexte d'Application chargé à deux reprises - le Printemps de Démarrage
J'ai un assez simple d'installation. Un projet maven avec 3 modules : core/webapp/modèle. Je suis l'aide de Printemps de démarrage de la vitesse de ma demande. Dans webapp, j'ai une classe simple WebappConfig comme suit:
@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);
}
}
et quelques classes de base/le module de modèle. Mon conteneur-point d'application est :
public class AbcdXml extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(WebappConfig.class);
}
}
Et pas de web.xml! Mon modèle pom a la suite du printemps de démarrage liés à la dépendance :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Core 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>
Maintenant en cours d'exécution WebappConfig via Exécuter en tant qu' -> Java application fonctionne parfaitement mais j'ai besoin de déployer le projet comme une guerre sur tomcat7. Webapp emballage est la guerre. Il n'y a pas de tomcat fourni pot en lib sauf tomcat-jdbc et tomcat-tuli pot(il ne devrait pas être un problème?).
Lorsque je déploie mon abcd.la guerre, applicationcontext devient chargé à deux reprises et le résultat dans d'erreur suivant 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)
Il n'y a pas de web.xml comme je l'ai mentionné plus tôt.
Peu de choses intéressantes que je ne peux pas comprendre pourquoi :
- Après l'explosion de la guerre, tomcat en quelque sorte créer un dossier RACINE par défaut web.xml[Doit être le Printemps de démarrage d'une mauvaise configuration. Comment puis-je la corriger? Les pointeurs s'il vous plaît?]
- Même si je retourne même l '"application" SpringApplicationBuilder dans AbcdXml.java je suis confronté au même problème de applicationcontext chargé à deux reprises.
Merci pour votre aide!
EDIT 1:
Contenu de web.xml qui est généré dans le dossier RACINE :
<?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>
- Quel est le mystérieux web.xml contient-il?
- celui qui est généré dans le dossier RACINE? mise à jour en question.
- Qui a l'air inoffensif. Mais vous avez un
ContextLoaderListener
dans la trace de la pile qui semble erroné. Peut-être que vous pourriez commencer avec un seul fichier war (fossé, les deux autres) et de reproduire le problème, puis de publier un lien vers l'ensemble du projet? - Ainsi, le modèle de l'emballage est jar, core est jar et de la dépendance entre les modules est d'habitude. Besoins de base module et webapp besoins de base. Peut-être que je manque quelque chose ici, quand vous avez dit "Fossé de deux autres"? Il y a une guerre de toute façon!
- Juste essayer de réduire la surface. Peut-être que l'un de vos pots a un
WebApplicationInitilaizer
- t-il? - Ouais, mais je ne pouvais pas trouver toutes les délinquance de la classe. Voici la liste des pots dans le dossier lib - oi62.tinypic.com/of62yx.jpg juste au cas où si c'est utile.
- jersey-spring3 est probablement le coupable. Il y a quelques utilitaires pour travailler avec jersey ici: github.com/dsyer/spring-boot-jersey. L'une des choses qu'il n'est de prévenir le Jersey à partir de la tentative de créer un Printemps contexte.
- Yep, c'était bien ça. N'aurais jamais deviné. Merci @DaveSyer 🙂 je peux accepter/upvote votre solution si vous post ci-dessus à titre de réponse, sinon je vais le poster quand même pour qu'il puisse aider les autres.
Vous devez vous connecter pour publier un commentaire.
Si votre application contient jersey-spring3 et vous ne prenez pas des mesures pour la désactiver, il va essayer de créer un
ApplicationContext
pour vous (utile, non). Il y a un moyen de l'éteindre (dans unWebApplicationInitializer
):Ou tout simplement utiliser ce: https://github.com/dsyer/spring-boot-jersey (inclure en tant que dépendance).
Dans mon cas j'ai eu le même problème - voir le Printemps
splash screen
deux fois - C'était parce que j'avais 2 classes que l'étendueSpringBootServletInitializer
. On a appeléSpringBootWebApplication
et les autresServletInitializer
. J'ai juste enlevé leServletInitializer
et il a travaillé sur OK. Je ne sais pas pourquoi il y avait 2 classes - peut-être parce que je me suis inspirée de 2 différents exemples de rassembler ce dont j'avais besoin.Dans mon cas, le coupable était l'aide de Printemps de Démarrage 1.3.0.M4, avec Jersey 2.21. Quand j'ai rétrogradé Printemps de Démarrage pour 1.2.6.RELÂCHEZ le problème est disparu.
La seule chose que j'avais à faire était de remplacer explicitement les propriétés suivantes, que j'avais besoin de printemps 4.2.0 pour Hibernate 5 support, et jackson 2.6.2 pour JSR310 (java8 java.temps de charge:
EDIT: Comme le spring-boot 1.3.0.De presse, ce bug existe toujours. Voir github
@EnableAutoConfiuguration à partir de l'API dit "Activer la fonction d'auto-configuration du Printemps Contexte d'Application, d'essayer de deviner et de configurer les haricots que vous êtes susceptible d'avoir besoin."
@ComponentScan serait aussi instancier les haricots. IL analyse les paquets, à trouver et enregistrer les haricots.
Que vous utilisez à la fois ces annotations, je suppose que c'est pourquoi son chargement deux fois.