Publicar en Variables de Contexto Objetos del Arbol JNDI

Mediante el componente ContextVariableFromJndiLookup podemos publicar en variables de contexto, los objetos que se encuentran publicados en el árbol JNDI como por ejemplo: el nombre de la aplicación, DataSources, etc.

Al ser publicado en una variable de contexto, pueden ser utilizados en expresiones EL o ser inyectados como dependencia mediante la anotación @In.

Es util, por ejemplo, cuando tenemos una fuente de datos (DataSource) que inyectamos en varios EJBs, mediante la anotación @Resource. Si cambiamos la ruta JNDI de la fuente de datos, podemos cambiarla de una vez en todos los EJBs, si se inyecta la variable creada.

Para crear estas variables de contexto, tenemos que definirlas en el fichero components.xml. Veamos un ejemplo:

<?xml version="1.0" encoding="ISO-8859-1"?>
<components xmlns="http://jboss.com/products/seam/components"
    ...>
 
	<component name="defaultDataSource" class="org.umu.atica.seam.components.ContextVariableFromJndiLookup" installed="true">
		<property name="jndiPath">jdbc/Unica DataSource</property>
		<property name="classType">javax.sql.DataSource</property>
	</component>
 
	<component name="applicationName" class="org.umu.atica.seam.components.ContextVariableFromJndiLookup" installed="true">
		<property name="jndiPath">java:app/AppName</property>
		<property name="classType">java.lang.String</property>
	</component>
 
</components>

Para la definición de la variable de contexto, utilizamos la etiqueta <component> de JBoss Seam, que permite definir componentes a partir de clases Java. Las propiedades de la la etiqueta <component> son:

Dentro de la etiqueta <component>, podemos definir etiquetas <property>, para asignar los valores necesarios para la obtención del objeto. La definición es la siguiente:

Por defecto, el ámbito de la variable de contexto es EVENT, que es análogo a ámbito Request de HTTP.

Como vemos en el ejemplo anterior:

La propiedad classType sirve para validar el objeto publicado en el árbol JNDI al arrancar la aplicación. Si el objeto devuelto, no es una instancia de la clase o interface definido en classType, se mostrara un mensaje de warning en la consola de la aplicación, y cuando se recupere el objeto, devolvera el valor null.

Veamos un ejemplo de como inyectar la variable de contexto creada, mediante la anotación @In:

package my.prueba.inyeccion;
 
@Name("miPrueba")
public class MiPrueba {
 
    @In
    private DataSource defaultDataSource;
 
    @In("defaultDataSource")
    private DataSource dataSource;
 
    ...
 
}

JUAN MIGUEL BERNAL GONZALEZ 2014/11/26 18:15