martes, 12 de junio de 2012

Migrando a JEE 6 / EJB 3.1 (I)

“I’ve finally learned what ‘upward compatible’ means. It means we get to keep all our old mistakes.”
Dennie van Tassel

La especificación JEE 6 junto con la enorme lista de nuevas tecnologías que comporta (EJB 3.1, JAX-RS 1.1, JAX-WS 2.2, Java Servlet 3.0, etc...) está disponible desde diciembre de 2009. A pesar de haber pasado 2 años y medio, la verdad es que apenas he podido ponerla en funcionamiento en apenas un par de nuevos proyectos.
De esta nueva especificación destaca especialmente la especificación EJB 3.1 con muchas, potentes y útiles novedades. Sin embargo, en la adopción de esta especificación me he encontrado con algunos aspectos ásperos, incompatibilidades y diversos problemas indocumentados. Este artículo (y alguno que le sucederá) intentará ahorrar al lector interesado, al menos, el tiempo que yo he perdido intentando hacer funcionar cosas que teóricamente (en base a la documentación) deberían funcionar.

1. Incompatibilidad de la notación @Webservice con la vista sin interfaz (no-interface view)

Supongamos que tienes un EJB 3.0 publicado como Webservice, así:

 
/**
 * Stateless Session EJB 3.0
 * @author szarza
 */

@Stateless(name="CacheService")
@TransactionManagement(TransactionManagementType.BEAN)
@WebService(serviceName="CacheService",name="CacheService")
public class CacheServiceBean implements CacheServiceLocal {

 

Si vas a migrar a EJB 3.1, puedes tener la tentación de eliminar la interfaz local y usar la vista sin interfaz para simplificar tu proyecto... pero, lamentablemente, al eliminar la interfaz local, en Glassfish 3.1 me encuentro con un desagradable mensaje en despliegue:

[#|2012-06-11T15:43:38.754+0200|SEVERE|glassfish3.1.2|javax.enterprise.system.core.com.sun.enterprise.v3.server|_ThreadID=108;_ThreadName=Thread-2;|Cannot resolve reference Local ejb-ref name=cestel.services.cache.timer.CacheUpdaterTimedBean/cacheService,Local 3.x interface =cestel.services.cache.facade.CacheServiceLocal,ejb-link=null,lookup=,mappedName=,jndi-name=,refType=Session
java.lang.RuntimeException: Cannot resolve reference Local ejb-ref name=cestel.services.cache.timer.CacheUpdaterTimedBean/cacheService,Local 3.x interface =cestel.services.cache.facade.CacheServiceLocal,ejb-link=null,lookup=,mappedName=,jndi-name=,refType=Session...

En definitiva: simplemente no funciona. La notación @Webservice es incompatible con la vista sin interfaz. Puede parecer más o menos lógico... pero no lo he visto en la documentación por ninguna parte.

2. Incompatibilidad de la notación @Path@Produces en un módulo ejb

De la misma forma que se puede "publicar" de manera sencilla un EJB como un SOAP webservice JAX-WS simplemente añadiendo la notación @Webservice, podría ser igualmente sencillo publicarlo como un webservice RESTful (JAX-RS) añadiendo la notación @Path  y @Produces... pero no. Al menos en Glassfish 3.1.2 no es posible publicar un webservice REST en un módulo EJB. Esto me ha parecido un verdadero engorro, ya que nos obliga a realizar un módulo war sólo para esto.

En definitiva, si necesitáis un servicio REST, debes hacer un módulo war.

El próximo capítulo lo dedicaré a la adaptación a la nueva definición de JNDI portable y sus sorpresas inexplicables (por poco documentadas).


Referencias y más información:
Related Posts Plugin for WordPress, Blogger...
cookieassistant.com