2010-07-12 4 views
0

Lorsque je démarre une webapp qui a une configuration de ressort en jetée, je vois deux appels à l'initialisation (méthodes @PostConstruct). web.xml déclare un ContextLoaderListener et fournit contextConfigLocation.double initialisation de spring beans dans jetty 7.1.4

Cela semble faux. (printemps 3.0.3). Y a-t-il quelque chose que j'ai fait?

EDIT

Mon web.xml appelle à la fois le DispatcherServlet et le org.springframework.web.context.ContextLoaderListener. Si je retire le plus tard, je cesse de voir deux initialisations --- mais mon application échoue dans la jetée-maven-plugin avec

No WebApplicationContext found: no ContextLoaderListener registered? 

EDIT 2:

Got it. Le servlet dispatch va trouver des fichiers de contexte par nom conventionnel (* -servlet.xml), et ainsi appeler à nouveau ce fichier dans contextConfigLocation a conduit à le charger deux fois.

Trace de la pile 1:

Segmenter.initialize() line: 63 
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] 
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39 
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25 
Method.invoke(Object, Object...) line: 597 
InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(Object) line: 340  
InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(Object, String) line: 293  
CommonAnnotationBeanPostProcessor(InitDestroyAnnotationBeanPostProcessor).postProcessBeforeInitialization(Object, String) line: 130 
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).applyBeanPostProcessorsBeforeInitialization(Object, String) line: 394  
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).initializeBean(String, Object, RootBeanDefinition) line: 1405  
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 519 
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 456 
AbstractBeanFactory$1.getObject() line: 291 
DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory) line: 222 
DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class<T>, Object[], boolean) line: 288  
DefaultListableBeanFactory(AbstractBeanFactory).getBean(String) line: 190 
DefaultListableBeanFactory.preInstantiateSingletons() line: 574 
XmlWebApplicationContext(AbstractApplicationContext).finishBeanFactoryInitialization(ConfigurableListableBeanFactory) line: 895 
XmlWebApplicationContext(AbstractApplicationContext).refresh() line: 425  
ContextLoaderListener(ContextLoader).createWebApplicationContext(ServletContext, ApplicationContext) line: 276 
ContextLoaderListener(ContextLoader).initWebApplicationContext(ServletContext) line: 197  
ContextLoaderListener.contextInitialized(ServletContextEvent) line: 47 
JettyWebAppContext(ContextHandler).startContext() line: 645 
JettyWebAppContext(ServletContextHandler).startContext() line: 200 
JettyWebAppContext(WebAppContext).startContext() line: 995 
JettyWebAppContext(ContextHandler).doStart() line: 588 
JettyWebAppContext(WebAppContext).doStart() line: 381 
JettyWebAppContext.doStart() line: 114 
JettyWebAppContext(AbstractLifeCycle).start() line: 55 
ContextHandlerCollection(HandlerCollection).doStart() line: 165 
ContextHandlerCollection.doStart() line: 162  
ContextHandlerCollection(AbstractLifeCycle).start() line: 55  
HandlerCollection.doStart() line: 165 
HandlerCollection(AbstractLifeCycle).start() line: 55 
JettyServer(HandlerWrapper).doStart() line: 92 
JettyServer(Server).doStart() line: 228 
JettyServer.doStart() line: 67 

trace Stack 2:

Segmenter.initialize() line: 63 
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] 
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39 
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25 
Method.invoke(Object, Object...) line: 597 
InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(Object) line: 340  
InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(Object, String) line: 293  
CommonAnnotationBeanPostProcessor(InitDestroyAnnotationBeanPostProcessor).postProcessBeforeInitialization(Object, String) line: 130 
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).applyBeanPostProcessorsBeforeInitialization(Object, String) line: 394  
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).initializeBean(String, Object, RootBeanDefinition) line: 1405  
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).doCreateBean(String, RootBeanDefinition, Object[]) line: 519 
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String, RootBeanDefinition, Object[]) line: 456 
AbstractBeanFactory$1.getObject() line: 291 
DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, ObjectFactory) line: 222 
DefaultListableBeanFactory(AbstractBeanFactory).doGetBean(String, Class<T>, Object[], boolean) line: 288  
DefaultListableBeanFactory(AbstractBeanFactory).getBean(String) line: 190 
DefaultListableBeanFactory.preInstantiateSingletons() line: 574 
XmlWebApplicationContext(AbstractApplicationContext).finishBeanFactoryInitialization(ConfigurableListableBeanFactory) line: 895 
XmlWebApplicationContext(AbstractApplicationContext).refresh() line: 425  
DispatcherServlet(FrameworkServlet).createWebApplicationContext(ApplicationContext) line: 442 
DispatcherServlet(FrameworkServlet).createWebApplicationContext(WebApplicationContext) line: 458  
DispatcherServlet(FrameworkServlet).initWebApplicationContext() line: 339 
DispatcherServlet(FrameworkServlet).initServletBean() line: 306 
DispatcherServlet(HttpServletBean).init() line: 127 
DispatcherServlet(GenericServlet).init(ServletConfig) line: 241 
ServletHolder.initServlet() line: 421 
ServletHolder.doStart() line: 245 
ServletHolder(AbstractLifeCycle).start() line: 55 
ServletHandler(ServletHandler).initialize() line: 691 
JettyWebAppContext(ServletContextHandler).startContext() line: 204 
JettyWebAppContext(WebAppContext).startContext() line: 995 
JettyWebAppContext(ContextHandler).doStart() line: 588 
JettyWebAppContext(WebAppContext).doStart() line: 381 
JettyWebAppContext.doStart() line: 114 
JettyWebAppContext(AbstractLifeCycle).start() line: 55 
ContextHandlerCollection(HandlerCollection).doStart() line: 165 
ContextHandlerCollection.doStart() line: 162  
ContextHandlerCollection(AbstractLifeCycle).start() line: 55  
HandlerCollection.doStart() line: 165 
HandlerCollection(AbstractLifeCycle).start() line: 55 
JettyServer(HandlerWrapper).doStart() line: 92 
JettyServer(Server).doStart() line: 228 
JettyServer.doStart() line: 67 

Répondre

2

actally, vous avez deux contextes d'application Spring:

  • Contexte chargé par ContextLoaderListener à partir des fichiers XML spécifiés par context-param nommé contextConfigLocation (ou applicationContext.xml par défaut).
  • Contexte chargé par DispatcherServlet à partir des fichiers XML spécifiés par le init-param du servlet du répartiteur nommé contextConfigLocation (ou <servletname>-servlet.xml par défaut).

Le premier est un contexte parent de ce dernier. Donc, vous avez en quelque sorte une définition du même bean dans les deux contextes (peut-être, les deux contextConfigLocation pointent vers les mêmes fichiers XML).

+0

Une idée intéressante ... mais non. Le bean qui est appelé deux fois se trouve exactement dans un fichier .xml. Mais j'ai à la fois le servlet et le répartiteur, et c'est faux, n'est-ce pas? – bmargulies

+0

@bmargulies: Montre le 'web.xml', s'il te plait. – axtavt

+0

Prob maintenant décrit dans edit. contextConfigLocation incluait à la fois le fichier de contexte pour la sécurité et aussi un nom de fichier springapp-servlet.xml. Le répartiteur a ramassé ça automatiquement, donc j'ai fini par le charger * deux fois *. – bmargulies

Questions connexes