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.
Firmi prego dentro per inbandierare questo come inadeguato.