====== Publicar en Variables de Contexto Objetos del Arbol JNDI ====== Mediante el componente [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-seam-components/es/um/atica/seam/components/ContextVariableFromJndiLookup.html|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 [[http://docs.jboss.org/seam/2.3.1.Final/api/org/jboss/seam/annotations/In.html|@In]]. Es util, por ejemplo, cuando tenemos una fuente de datos (//DataSource//) que inyectamos en varios EJBs, mediante la anotación [[https://docs.oracle.com/javaee/6/api/javax/annotation/Resource.html|@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 [[http://docs.jboss.org/seam/2.3.1.Final/reference/html/xml.html#xml.descriptor|components.xml]]. Veamos un ejemplo: jdbc/Unica DataSource javax.sql.DataSource java:app/AppName java.lang.String Para la definición de la variable de contexto, utilizamos la etiqueta //// de JBoss Seam, que permite definir componentes a partir de clases Java. Las propiedades de la la etiqueta //// son: * **//name//**: el nombre que le damos a la variable de contexto que queremos crear. * **//class//**: la clase base que define al componente. * **//installed//**: para indicar que se instale el componente, mediante un valor booleano. Dentro de la etiqueta ////, podemos definir etiquetas ////, para asignar los valores necesarios para la obtención del objeto. La definición es la siguiente: * **//jndiPath//**: la ruta JNDI del objeto a publicar. * **//classType//**: El tipo del objeto a recuperar. Por defecto, el ámbito de la variable de contexto es [[http://docs.jboss.org/seam/2.3.1.Final/api/org/jboss/seam/ScopeType.html#EVENT|EVENT]], que es análogo a ámbito Request de HTTP. Como vemos en el ejemplo anterior: * La variable de contexto //defaultDataSource// esta publicada en la ruta JNDI //jdbc/Unica DataSource// y el tipo devuelto que encapsula al objeto es la interface [[http://docs.oracle.com/javase/7/docs/api/javax/sql/DataSource.html|javax.sql.DataSource]]. * La variable de contexto //applicationName// esta publicada en la ruta JNDI //java:app/AppName// y el tipo devuelto que encapsula al objeto es la clase [[http://docs.oracle.com/javase/7/docs/api/java/lang/String.html|java.lang.String]]. 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 [[http://docs.jboss.org/seam/2.3.1.Final/api/org/jboss/seam/annotations/In.html|@In]]: package my.prueba.inyeccion; @Name("miPrueba") public class MiPrueba { @In private DataSource defaultDataSource; @In("defaultDataSource") private DataSource dataSource; ... } ---- --- //[[juanmiguelbg@um.es|JUAN MIGUEL BERNAL GONZALEZ]] 2014/11/26 18:15//