EJB 3.1 en Porlets de Liferay
Ya que GlassFish v3 es compatible con Java EE6, y permite módulos web con componentes EJB (por la característica propia de EJB 3.1).. y además Liferay puede ser instalado sobre GlassFish v3... y... los portlets son módulos web con otro archivo de despligue ¿los portlets para Liferay/GFv3 deberían permitir EJB 3.1?
Pues la respuesta es sencilla: Sí. Pero cuando uno desarrolla un portlet con EJB 3.1 y lo trata de desplegar sobre Lfieray 6.0, no funciona. Por alguna razón no despliega correctamente la aplicación, lanza errores de clases de SpringFramework faltantes, etc. Lo curioso es que si se despliega sobre Liferay 5, sí funciona correctamente. Entonces ¿qué pasa?. Pues bien, leyendo un poco los mensajes de error y después de varias pruebas.. pude dar con la solución.
Para comenzar, el error que lanza es el siguiente:
Pero si examinamos la carpeta
La solución a este problema es el siguiente: debemos copiar ciertas bibliotecas de Spring a la carpeta
Pero! (no tan rápido), como las clases portlets (descendientes de
Pues habrá que utilizar el JNDI dentro del módulo, de la siguiente manera:
Algo más explicado sobre cómo acceder a las clases EJB 3.1 se encuentra en este post: Cliente remoto de EJB 3.1
Espero que les sea de utilidad.
Pues la respuesta es sencilla: Sí. Pero cuando uno desarrolla un portlet con EJB 3.1 y lo trata de desplegar sobre Lfieray 6.0, no funciona. Por alguna razón no despliega correctamente la aplicación, lanza errores de clases de SpringFramework faltantes, etc. Lo curioso es que si se despliega sobre Liferay 5, sí funciona correctamente. Entonces ¿qué pasa?. Pues bien, leyendo un poco los mensajes de error y después de varias pruebas.. pude dar con la solución.
Para comenzar, el error que lanza es el siguiente:
Error in annotation processing: java.lang.NoClassDefFoundError: org/springframework/transaction/PlatformTransactionManager
Pero si examinamos la carpeta
lib
del módulo de liferay, sí están las bibliotecas de Spring. La solución a este problema es el siguiente: debemos copiar ciertas bibliotecas de Spring a la carpeta
lib
del dominio donde está instalado el Liferay. Para evitar conflictos de versión del Spring, copiemos los siguientes archivos .jar del .war de Liferay a $GLASSFISH_HOME/domains/domain1/lib
.- aopalliance.jar
- aspectj-rt.jar
- aspectj-weaver.jar
- commons-logging.jar
- spring-aop.jar
- spring-asm.jar
- spring-beans.jar
- spring-context.jar
- spring-core.jar
- spring-expression.jar
- spring-transaction.jar
Pero! (no tan rápido), como las clases portlets (descendientes de
javax.portlet.GenericPortlet
) no son parte del estándar de un módulo web, entonces no podrá utilizarse un EJB con la notación @EJB
(lo que sí funciona en un Servlet). Entonces ¿cómo instanciar EJB?:Pues habrá que utilizar el JNDI dentro del módulo, de la siguiente manera:
Context c = new InitialContext();
EjbFacade facade= c.lookup("java:global/NombrePorlet/NombreEjbFacade!paquete.ejb.NombreEjbFacade");
Algo más explicado sobre cómo acceder a las clases EJB 3.1 se encuentra en este post: Cliente remoto de EJB 3.1
Espero que les sea de utilidad.
Esta chido llevo rato queriendo hacer eso en glassfish v3 y netbeans 6.9.1 con portal pack solo me da opcion para para JEE5 y si solo agrego glassfish me da para JEE6 pero se le hace falto algo para que lo deploye como un proyecto para liferay. No podria pasarme un ejemplo.
ResponderBorrarYo hago un artificio:
ResponderBorrar1- creo el proyecto para JavaEE6
2- lo cambio para JavaEE5 (desde las propiedades del proyecto.. seleccionas el Liferay)
3- le agrego el framework de Portlets
Y listo. Si quieres programar como JavaEE6, le cambias a JavaEE6, y si quieres desplegarlo como Portlet, le cambias a JavaEE5 (Liferay)
Hola Diego, te comento que intente hacer el artificio y nada, con netbeans 7.1.1 creo el proyecto web, lo asocio a un servidor glassfish y le doy soporte java ee 6, termino de crearlo y no me permite cambio a java ee 5 ni esta disponible el servidor liferay (que es otro dominio del servidor glassfish), alguna recomendación?
Borrar