Tribune

Home » Liferay Portal » Français » 3. Développement

Vista Combinata Vista Piatta Vista ad Albero
Discussioni [ Precedente | Successivo ]
toggle
Aladin Seoud
web.xml + probleme deux context et deux listener
9 dicembre 2010 13.46
Risposta

Aladin Seoud

Punteggio: New Member

Messaggi: 2

Data di Iscrizione: 23 novembre 2010

Messaggi recenti

Bonjour tous le monde,
Je viens de développer pour la première fois une portlet en utilisant NetBeans, serveur liferay et en installant le plugin PortalPack 3 pour le développement d'une portlet avec spring MVC.
Le problème est dans le fichier web.xml de projet.
Le fichier contient initialement un seul context et un seul listener:
1
2    <context-param>
3        <param-name>contextConfigLocation</param-name>
4        <param-value>/WEB-INF/applicationContext.xml</param-value>
5    </context-param>
6    <listener>
7        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
8    </listener>

Lorsque on crée les services avec le servicebuilder.xml et on les génères.
Il ajoute automatiquement deux nouveaux contexts et un nouveau listener au fichier web.xml
 1
 2<context-param>
 3        <param-name>contextClass</param-name>
 4        <param-value>com.liferay.portal.spring.context.PortletApplicationContext</param-value>
 5    </context-param>
 6    <context-param>
 7        <param-name>contextConfigLocation</param-name>
 8        <param-value>WEB-INF/classes/META-INF/misc-spring.xml,WEB-INF/classes/META-INF/data-source-spring.xml,WEB-INF/classes/META-INF/base-spring.xml,WEB-INF/classes/META-INF/hibernate-spring.xml,WEB-INF/classes/META-INF/infrastructure-spring.xml,WEB-INF/classes/META-INF/portlet-spring.xml,WEB-INF/classes/META-INF/ext-spring.xml</param-value>
 9    </context-param>
10    <listener>
11        <listener-class>com.liferay.portal.kernel.spring.context.PortletContextLoaderListener</listener-class>
12    </listener>

Ensuite lorsque on déployé le projet en accédant a un service généré il affiche un erreur de type BeanLocator is null.
Ma question est-ce-que on peut utiliser deux context et deux listener dans le fichier web.xml.
Merci beaucoup d'avance.
Alexandre FILLATRE
RE: web.xml + probleme deux context et deux listener
12 dicembre 2010 9.44
Risposta

Alexandre FILLATRE

Punteggio: Junior Member

Messaggi: 65

Data di Iscrizione: 2 dicembre 2010

Messaggi recenti

Bonjour,

Ceci est un problème récurrent quand on utilise une version de Spring différente de celle de Liferay.
Lorsque Liferay détecte une webapp contenant le fichier service.properties, il ajoute automatiquement le listener "com.liferay.portal.kernel.spring.context.PortletContextLoaderListener" afin de charger le beanLocator, et ainsi d'être capable de résoudre les beans Spring générés avec le service builder. Le problème est que non, il n'est pas possible d'utiliser 2 ContextLoaderListeners dans la même webapp.

Tant que l'on utilise pas le servicebuilder, ça va bien. Sinon, il faut ruser de la manière suivante (un peu compliqué, mais ça fonctionne et je n'ai pas trouvé mieux) :

1) Le but est d'isoler la partie génération du servicebuilder du reste des portlets. Il faut donc créer une nouvelle portlet contenant tous les jars Spring, et générer les classes du servicebuilder à l'intérieur.

2) Afin de pouvoir accéder à ces nouvelles classes (comme elles se trouvent maintenant dans une portlet à part), il faut modifier la tache "build-service" afin qu'elle copie le fichier *-service.jar dans les libraires globales du serveur (lib/ext pour tomcat), et non dans WEB-INF/lib de la nouvelle portlet.

3) Dans la nouvelle portlet, ajouter cela dans le web.xml
 1
 2    <listener>
 3        <listener-class>com.liferay.portal.kernel.spring.context.PortletContextLoaderListener</listener-class>
 4    </listener>
 5   
 6    <servlet>
 7        <servlet-name>Main servlet</servlet-name>
 8        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 9    </servlet>
10
11    <servlet-mapping>
12        <servlet-name>Main servlet</servlet-name>
13        <url-pattern>/*</url-pattern>
14    </servlet-mapping>


4) L'ancienne portlet a maintenant accès à toutes les interfaces générées (car le fichier *-service.jar a été placé dans les libs globales au point 2). Son web.xml sera "normal" d'un point de vu Spring, car il ne sera plus surchargé d'une nouveau ContextLoaderListener par Liferay :
 1    <listener>
 2        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 3    </listener>
 4   
 5    <servlet>
 6        <servlet-name>ViewRendererServlet</servlet-name>
 7        <servlet-class>org.springframework.web.servlet.ViewRendererServlet</servlet-class>
 8    </servlet>
 9
10    <servlet-mapping>
11        <servlet-name>ViewRendererServlet</servlet-name>
12        <url-pattern>/WEB-INF/servlet/view</url-pattern>
13    </servlet-mapping>



Bien entendu, il faut ensuite ajouter dans la partie *-service.jar tout ce qui doit être accessible par les autres portlets, en restant sur des interfaces si possible.


Pour résumer, on a donc 1 portlet sans JSPs, qui contiendra tous les services "buildés", et les autres portlets "normales" appelant les services de la première.

En espérant que ça t'aide.
Bonne soirée.

Alexandre FILLATRE.
Fairouz F
RE: web.xml + probleme deux context et deux listener
20 marzo 2011 9.44
Risposta

Fairouz F

Punteggio: Junior Member

Messaggi: 52

Data di Iscrizione: 3 febbraio 2011

Messaggi recenti

Bonjour,
SVP j'ai pas bien compris les détails de ce principe .
SVP ,est-ce-que vous pouvez me donner un exemple ou un lien pour que je puisse appliquer ce principe.
Merci d'avance