SeamFramework.orgCommunity Documentation

Apéndice A. Integración de la IR de Web Beans en otros entornos

Actualmente la IR de Web Beans sólo se ejecuta en JBoss AS 5; integrando la IR dentro de otros entornos EE (por ejemplo otro servidor de aplicación como Glassfish), dentro de un contenedor de servlet (como Tomcat), o con una implementación incrustada EJB3.1 es bastante fácil. En este apéndice veremos brevemente los pasos requeridos.

Nota

Debería ser posible ejecutar Web Beans en un entorno SE, pero tendría que hacer más cosas, agregar sus propios contextos y ciclo de vida. La IR de Web Beans actualmente no expone puntos de extensión del ciclo de vida, por lo tanto se tendría que codificar directamente en clases IR de Web Beans.

El SPI de Web Beans está ubicado en el módulo webbeans-ri-spi, empaquetado como webbeans-ri-spi.jar. Algunos SPI son opcionales, si necesita anular la conducta predeterminada, se requerirán otros.

Se puede especificar la implementación de un SPI ya sea como una propiedad del sistema, o en un archivo de propiedades META-INF/web-beans-ri.properties. Todos los nombres de propiedad son el nombre completo de clase de la interfaz implementada; todos los valores de propiedad son el nombre completo de clase calificado de la clase de implementación.

Todas las interfaces en el patrón decorador SPI soportan y proporcionan una clase Forwarding.

La IR de Web Beans también delega el descubrimiento de bean EJB3 al contenedor para no tener que examinar las anotaciones EJB3 o analizar ejb-jar.xml. Para cada EJB en la aplicación se debe descubrir un EJBDescriptor:

public interface EjbDiscovery

{
   public static final String PROPERTY_NAME = EjbDiscovery.class.getName();
   
   /**
    * Gets a descriptor for each EJB in the application
    * 
    * @return The bean class to descriptor map 
    */
   public Iterable<EjbDescriptor<?>
> discoverEjbs();
   
}
public interface EjbDescriptor<T

> {
   
   /**
    * Gets the EJB type
    * 
    * @return The EJB Bean class
    */
   public Class<T
> getType();
   /**
    * Gets the local business interfaces of the EJB
    * 
    * @return An iterator over the local business interfaces
    */
   public Iterable<BusinessInterfaceDescriptor<?>
> getLocalBusinessInterfaces();
   
   /**
    * Gets the remote business interfaces of the EJB
    * 
    * @return An iterator over the remote business interfaces
    */
   public Iterable<BusinessInterfaceDescriptor<?>
> getRemoteBusinessInterfaces();
   
   /**
    * Get the remove methods of the EJB
    * 
    * @return An iterator over the remove methods
    */
   public Iterable<Method
> getRemoveMethods();
   /**
    * Indicates if the bean is stateless
    * 
    * @return True if stateless, false otherwise
    */
   public boolean isStateless();
   /**
    * Indicates if the bean is a EJB 3.1 Singleton
    * 
    * @return True if the bean is a singleton, false otherwise
    */
   public boolean isSingleton();
   /**
    * Indicates if the EJB is stateful
    * 
    * @return True if the bean is stateful, false otherwise
    */
   public boolean isStateful();
   /**
    * Indicates if the EJB is and MDB
    * 
    * @return True if the bean is an MDB, false otherwise
    */
   public boolean isMessageDriven();
   /**
    * Gets the EJB name
    * 
    * @return The name
    */
   public String getEjbName();
   
   
}

El EjbDescriptor es bastante auto explicativo y debería devolver los metadatos pertinentes como se define en la especificación de EJB. Además de estas dos interfaces, está BusinessInterfaceDescriptor, la cual representa una interfaz de negocios local (encapsulando la clase de interfaz y el nombre de jndi a la búsqueda de una instancia del EJB).

Se le puede pedir a la IR de Web Beans cargar la implementación de EjbDiscovery mediante la propiedad org.jboss.webbeans.bootstrap.spi.EjbDiscovery con el nombre completo de la clase calificada como el valor. Por ejemplo:

org.jboss.webbeans.bootstrap.spi.EjbDiscovery=org.jboss.webbeans.integration.jbossas.EjbDiscoveryImpl

Si la IR de Web Beans se utiliza en un contenedor de Servlet, se espera un constructor de la forma:

public EjbDiscoveryImpl(ServletContext servletContext) {}

El contexto de Servlet se puede utilizar para permitir que la implementación de EjbDiscovery interactúe con el contenedor.

La IR de Web Beans necesita cargar clases y recursos desde el classpath en varios momentos. Por defecto, se cargan desde el mismo classloader utilizado para cargar la IR, sin embargo, puede no ser lo apropiado para algunos entornos. Si este es el caso, implemente org.jboss.webbeans.spi.ResourceLoader:



         public interface ResourceLoader {
    
   /**
    * Creates a class from a given FQCN
    * 
    * @param name The name of the clsas
    * @return The class
    */
   public Class<?> classForName(String name);
   
   /**
    * Gets a resource as a URL by name
    * 
    * @param name The name of the resource
    * @return An URL to the resource
    */
   public URL getResource(String name);
   
   /**
    * Gets resources as URLs by name
    * 
    * @param name The name of the resource
    * @return An iterable reference to the URLS
    */
   public Iterable<URL
> getResources(String name);
   
}
         

y le pide a la IR que lo utilice:

org.jboss.webbeans.resources.spi.ResourceLoader=com.acme.ResourceLoader

Si la IR de Web Beans se utiliza en un contenedor de Servlet, se espera un constructor de la forma:

public MyResourceLoader(ServletContext servletContext) {}

El contexto de Servlet puede utilizarse para permitir que la implementación de ResourceLoader interactúe con el contenedor.

Hay una serie de requisitos que la IR de Web Beans ubica en el contenedor para el funcionamiento correcto que está fuera de la implementación de las API.