2012-09-27 3 views
1

J'ai une application web avec peu de portlets de printemps. Chaque portlet a un xml avec son contrôleur déclaré, mais les services utilisés par les contrôleurs sont placés dans applicationContext.xml. Je sais que pour chaque portlet est créé un contexte d'application de printemps (à partir de son propre fichier XML), et chaque contexte a comme contexte racine le contexte d'application de printemps créé à partir de applicationContext.xml. Tous les beans déclarés dans applicationContext.xml sont communs à tous les portlets.liferay redéployer: le contexte racine est null sur redéployer

Donc nous allons avoir un exemple:

fichier xml pour portlet exemple-portlet.xml: ... ...

contrôleur ExampleController.java:

package example.controller; 
@Controller 
@RequestMapping(value = "VIEW") 
public class NavigareController { 

@Autowired 
private ExampleService es; 
... 
} 

applicationContext.xml:

... 
<context:component-scan base-package="example.service /> 
... 

Service ExampleServiceImpl.java:

package example.service; 
@Service 
public class ExampleServiceImpl implements ExampleService { 
... 
} 

Lorsque le serveur commence par l'application à l'intérieur, l'application démarre et tout fonctionne bien. Lorsque l'application est redéployé j'ai une erreur:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'exampleController'... 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private example.service.ExampleService... 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [example.service.ExampleService]... 

En conséquence, le portlet ne démarre pas.

Je déboguée les sources du lifery et j'ai trouvé le code suivant:

package org.springframework.web.portlet 
... 
public abstract class FrameworkPortlet extends GenericPortletBean 
implements ApplicationListener<ContextRefreshedEvent> { 
... 
protected ApplicationContext initPortletApplicationContext() { 
ApplicationContext parent = PortletApplicationContextUtils.getWebApplicationContext(getPortletContext()); 
ApplicationContext pac = createPortletApplicationContext(parent); 
... 

Le code ci-dessus, dans le premier cas (lorsque le serveur commence par application à l'intérieur) retourne pas parent nul, mais dans le deuxième cas (lorsque l'application est redéployée), il rétablit un parent nul. A l'intérieur PortletApplicationContextUtils.getWebApplicationContext (getPortletContext()) il y a le code suivant:

Object attr = pc.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); 

Donc, en premier cas cet attribut est dans un contexte de portlet, mais dans le second cas il n'est pas dans un contexte de portlet. Le problème est clair, le bean exampleService n'est pas trouvé dans null parent.

La question est: Y a-t-il un bug dans le processus de déploiement à chaud?. Aidez-moi, s'il vous plaît!!!

+0

Pouvez-vous donner la trace complète de l'erreur que vous obtenez? Et quelle est la version de liferay?Quel liferay bundle tomcat ou jboss ou glassfish etc? –

+0

Souhaitez-vous obtenir un indice qui résoudrait cette lecture à travers: http://stackoverflow.com/questions/5260119/how-to-deploy-portlets-to-liferay – mico

Répondre

2

Quelle est votre version de Liferay? Si elle est 6.1.1 alors c'est un problème connu

http://issues.liferay.com/browse/LPS-29103

Si vous avez juste besoin de déployer les portlets une fois - pour le changement des auditeurs dans web.xml manuellement comme suggéré dans le billet.

Si vous avez besoin de redéployer les portlets alot (pour le développement), la solution précédente prend beaucoup de temps et le plus simple est de rétrograder le correctif de la branche 6.2.0.

+0

merci, c'est le problème – Mihai

Questions connexes