<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AQuA.it &#187; Grails</title>
	<atom:link href="http://blog.aquait.info/category/grails/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.aquait.info</link>
	<description>Blog técnico de AQuA.it</description>
	<lastBuildDate>Mon, 17 Oct 2011 12:15:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Usando SessionBeans en Grails</title>
		<link>http://blog.aquait.info/2010/03/usando-sessionbeans-en-grails/</link>
		<comments>http://blog.aquait.info/2010/03/usando-sessionbeans-en-grails/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 19:17:21 +0000</pubDate>
		<dc:creator>Alejandro</dc:creator>
				<category><![CDATA[Grails]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.aquait.info/?p=204</guid>
		<description><![CDATA[¿SessionBeans y Grails? Una de la cualidades de Grails que personalmente más me gusta es su integración con JEE. Desde Grails podemos utilizar tags JSP, Session Beans y EntityBeans como si fueran parte integral del framework. En este post nos centraremos en como podemos invocar SessionBeans ya sean remotos o locales desde nuestro código Grails. [...]]]></description>
			<content:encoded><![CDATA[<p><strong>¿SessionBeans y Grails?</strong></p>
<p>Una de la cualidades de Grails que personalmente más me gusta es su integración con JEE. Desde Grails podemos utilizar tags JSP, Session Beans y EntityBeans como si fueran parte integral del framework.<br />
En este post nos centraremos en como podemos invocar SessionBeans ya sean remotos o locales desde nuestro código Grails. <span id="more-204"></span> Esta posibilidad junto con el manejo de los EntityBeans le aportan a Grails  adaptabilidad y escalabilidad. A que me refiero con esto, a que siendo prolijos podemos desarrollar una aplicación entera en Grails y luego más adelante pasar los modelos y los servicios a Entities y SessionBeans respectivamente. De esta forma podemos comenzar rápidamente a desarrollar nuestra aplicación haciendo uso de las ventajas de estar en un ambiente dinámico y luego cuando la aplicación está más definida y los cambios no son lo común entonces podemos pasar la capa de negocios a JEE. Este cambio no afecta a ningún otro componente de Grails como ser controladores o vistas.<br />
Para lograr esto último todo lo que debemos hacer es sustituir el código de las operaciones de los servicios por delegación a la misma operación en los SessionBeans creados.</p>
<p>A continuación veremos como se configura Grails para utilizar SessionBeans tanto para EJB3.0 como EJB2.1</p>
<p><strong>Inyectando los SessionBeans</strong><br />
Grails permite inyectar tanto en los servicios como en los controladores cualquier SB al igual que lo hace con sus servicios. Al Grails utilizar Spring en el manejo de sus componentes es posible utilizar todas las ventajas de este dentro de Grails. La forma más sencilla de configurar los objetos a ser inyectados dentro de los controladores o servicios, y en especial los SB, es utilizando el archivo resources.groovy. Este archivo es equivalente a el archivo applicationContext.xml de Spring solo que en vez de ser un archivo XML es una clase groovy que utiliza el SpringBuilder como DSL para la configuración. Por defecto el archivo resources que se encuentra en grails-app/conf/spring y tiene el siguiente contenido:</p>
<pre class="brush: groovy">// Place your Spring DSL code here
beans = {

}</pre>
<p>Dentro del closure es donde se deben agregar las definiciones de los beans.</p>
<p><strong>Configuración de servidor JNDI</strong><br />
Para poder acceder a cualquier componente que se encuentra en un servidor de aplicaciones debemos hacerlo utilizando JNDI. Para esto Spring provee una clase utilitaria la cual facilita las operaciones sobre un servidor de nombres JNDI como ser lookup y a su vez actúa como un proveedor de contexto JNDI. Para esto hay que agregar la siguiente definición en el resources.groovy</p>
<pre class="brush: groovy">	ejbJndi(org.springframework.jndi.JndiTemplate){
		environment = [
			"java.naming.factory.initial" : "org.jnp.interfaces.NamingContextFactory",
			"java.naming.provider.url" : "jnp://http://localhost:1099</pre>
<p>Donde:</p>
<ul>
<li>
<dl>
<dt>ejbJndi </dt>
</dl>
</li>
</ul>
<dl>
<dd>Es el nombre del bean el cual es de tipo <em>org.springframework.jndi.JndiTemplate</em>.  Este nombre puede ser cualquiera. Es a este nombre que se hará referencia para determinar el servidor de nombres que provee el acceso a un objeto. </dd>
</dl>
<ul>
<li>
<dl>
<dt>environment </dt>
</dl>
</li>
</ul>
<dl>
<dd>Es la propiedad de JndiTempalte la cual se configura con un Mapa que tiene las propiedades JNDI </dd>
</dl>
<p>En un archivo podrían existir tantas definiciones de JndiTemplate como proveedores JNDI se necesiten acceder.</p>
<p><strong>Configuración de servidor JNDI por ENVIRONMENT</strong><br />
Es muy probable y necesario, que el servidor JNDI requiera diferente configuración de IP y puerto según sea el ambiente desarrollo, producción o testing. Para lograr esto se debe anexar a la configuración anterior lo siguiente:</p>
<ul>
<li>Colocar el valor de la IP y puerto del JBoss en cada environment del Config.groovy.</li>
<li>Importar la clase ConfigurationHolder en el archivo resources.groovy</li>
<li>Sustituir la ip y puerto de la variable "java.naming.provider.url" por las cargadas en la configuración.</li>
</ul>
<p><em>Ejemplo</em><br />
<strong>Config.groovy</strong></p>
<pre class="brush: groovy">  ...
  environments {
    development {
        ...
        jboss.ip = "10.200.8.173"
        jboss.port = "1099"
        ...
    }
    production {
        ...
        jboss.ip = "172.16.2.105"
        jboss.port = "1099"
        ...
    }</pre>
<p><strong>Resources.groovy</strong></p>
<pre class="brush: groovy">     import org.codehaus.groovy.grails.commons.*
     ...
	ejbJndi(org.springframework.jndi.JndiTemplate){
		environment = [
			"java.naming.factory.initial" : "org.jnp.interfaces.NamingContextFactory",
			"java.naming.provider.url" : "jnp://"+ConfigurationHolder.config.jboss.ip+":"+ConfigurationHolder.config.jboss.port]
	}</pre>
<p><strong>Configuración de componentes EJB 3.0</strong><br />
Para poder inyectar componentes EJB 3.0 tenemos que agregar la siguiente configuración:</p>
<pre class="brush: groovy">	xXXServices(org.springframework.jndi.JndiObjectFactoryBean){
		jndiName = "XXXServices/remote"
		jndiTemplate = ref("ejbJndi")
	}</pre>
<p>Donde:</p>
<ul>
<li>
<dl>
<dt>xXXServices</dt>
</dl>
</li>
</ul>
<dl>
<dd>Es el nombre que se le dará a la referencia remota al SB y que será utilizado para inyectar esta en los controladores y servicios. Cualquier controlador o servicio que tenga una propiedad con nombre xXXServices se le inyectara la referencia al SB remoto definido por ese nombre en el archivo resources.groovy. La primer <strong>x</strong> es en minúscula para indicar que por convención el nombre debe comenzar en minúscula.</dd>
</dl>
<ul>
<li>
<dl>
<dt>jndiName</dt>
</dl>
</li>
</ul>
<dl>
<dd>Nombre por el cual se va a buscar la referencia al SB en el servidor JNDI</dd>
</dl>
<ul>
<li>
<dl>
<dt>jndiTemplate</dt>
</dl>
</li>
</ul>
<dl>
<dd>Nombre del bean que se va a utilizar como provider para acceder al objeto JNDI. Es el definido en el punto anterior.</dd>
</dl>
<p>Para utilizar el SB en un servicio sería:</p>
<pre class="brush: groovy">public class EjemploServices {
	def xXXServices

	void unMetodo(param1, param2) {
		xXXServices.invocoMetodoEnEJB(param1, param 2)
	}
}</pre>
<p><strong>Configuración de componentes EJB 2.1</strong><br />
Para poder inyectar componentes EJB 2.1 tenemos que agregar la siguiente configuración que es similar a la vista para EJB 3.0.</p>
<pre class="brush: groovy"> xXXServices(org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean) {
		jndiName = "EJBXXXServices"
		businessInterface = "biz.aquait.yyy.ejb.EJBXXXServices"
		jndiTemplate = ref("ejbJndi")
		refreshHomeOnConnectFailure = true
                lookupHomeOnStartup=false

	}</pre>
<p>Donde:</p>
<ul>
<li>
<dl>
<dt>xXXServices</dt>
</dl>
</li>
</ul>
<dl>
<dd>Es el nombre que se le dará a la referencia remota al SB y que será utilizado para inyectar esta en los controladores y servicios. Cualquier controlador o servicio que tenga una propiedad con nombre xXXServices a esta se le inyectara la referencia al SB remoto definido por ese nombre en el archivo resources.groovy. La primer <strong>x</strong> es en minúscula para indicar que por convención el nombre debe comenzar en minúscula.</dd>
</dl>
<ul>
<li>
<dl>
<dt>jndiName</dt>
</dl>
</li>
</ul>
<dl>
<dd>Nombre por el cual se va a buscar la referencia al SB en el servidor JNDI</dd>
</dl>
<ul>
<li>
<dl>
<dt>refreshHomeOnConnectFailure</dt>
</dl>
</li>
</ul>
<dl>
<dd>Refresca la home cuando detecta un fallo en la conexión, por ejemplo cuando se reinicia el servidor</dd>
</dl>
<ul>
<li>
<dl>
<dt>lookupHomeOnStartup</dt>
</dl>
</li>
</ul>
<dl>
<dd>Hace que la aplicación no haga el lookup a levantar sino al utilizar servicios del SB.</dd>
</dl>
<ul>
<li>
<dl>
<dt>jndiTemplate</dt>
</dl>
</li>
</ul>
<dl>
<dd>Nombre del bean que se va a utilizar como provider para acceder al objeto JNDI. Es el definido en el primer punto.</dd>
</dl>
<ul>
<li>
<dl>
<dt>businessInterface</dt>
</dl>
</li>
</ul>
<dl>
<dd>La interfaz remota del SB, es decir la que extiende EJBObject.</dd>
</dl>
<p>La forma de utilizar el SB dentro de un servicio u otro componente es la misma forma que las referencias a SB implementados  con EJB 3.0.</p>
<p><strong>Conclusión</strong></p>
<p>Siguiendo los pasos presentados arriba podemos decir que configurar Grails para utilizar  SB no es engorroso y que el uso de estos dentro del framework es transparente ya que se usan de la misma forma que un servicio de Grails.</p>
<p><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F03%2Fusando-sessionbeans-en-grails%2F&amp;linkname=Usando%20SessionBeans%20en%20Grails" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_button_digg" href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F03%2Fusando-sessionbeans-en-grails%2F&amp;linkname=Usando%20SessionBeans%20en%20Grails" title="Digg" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F03%2Fusando-sessionbeans-en-grails%2F&amp;linkname=Usando%20SessionBeans%20en%20Grails" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_google_reader" href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fblog.aquait.info%2F2010%2F03%2Fusando-sessionbeans-en-grails%2F&amp;linkname=Usando%20SessionBeans%20en%20Grails" title="Google Reader" rel="nofollow" target="_blank"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.aquait.info%2F2010%2F03%2Fusando-sessionbeans-en-grails%2F&amp;title=Usando%20SessionBeans%20en%20Grails" id="wpa2a_2"><img src="http://blog.aquait.info/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.aquait.info/2010/03/usando-sessionbeans-en-grails/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

