Mostrando las entradas con la etiqueta glassfish. Mostrar todas las entradas
Mostrando las entradas con la etiqueta glassfish. Mostrar todas las entradas

11 octubre 2010

Desplegar una aplicación de grails que usa el Jasig CAS support for the Spring Security plugin

A veces el uso de nuevas tecnologías implica una extensa investigación para la resolución de problemas, ejemplo el deploy de una aplicación Grail 1.3.x en Glassfish. Esta ocasión quiero escribir un consejo para aquellos que estén usando Jasig CAS support for the Spring Security plugin y deseen desplegar su app en un serverlet container o bien un servidor de aplicaciones como lo es GlassFish. ¿Por qué hay necesidad de hacer esto?, principalmente por un bug que existe al momento del despliegue y en el proceso de creación del bean "casServiceProperties". El mensaje de error que aparecerá es similar a este:

2010-07-23 16:00:22,061 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] ERROR StackTrace  - Sanitizing stacktrace: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'casServiceProperties': Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'groovy.util.ConfigObject' to required type 'java.lang.String' for property 'artifactParameter'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [groovy.util.ConfigObject] to required type [java.lang.String] for property 'artifactParameter': no matching editors or conversion strategy found at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527) 
at org.codehaus.groovy.grails.commons.spring.ReloadAwareAutowireCapableBeanFactory.doCreateBean(ReloadAwareAutowireCapableBeanFactory.java:135) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322) 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1317) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1076) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) 
at org.codehaus.groovy.grails.commons.spring.ReloadAwareAutowireCapableBeanFactory.doCreateBean(ReloadAwareAutowireCapableBeanFactory.java:135) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)

La forma más simple de solucionar esto (workaround) es declarar en el Config.groovy todas las posibles propiedades que necesita el plugin, esto quiere decir que debemos declarar todas las opciones que nos dice la documentación del plugin y el resultado será semejante a esto:

//Config for CAS server grails.plugins.springsecurity.cas.loginUri = '/login'
grails.plugins.springsecurity.cas.serverUrlPrefix = 'http://server:8080/casserver'
grails.plugins.springsecurity.cas.serviceUrl = 'http://localhost:8080/app/j_spring_cas_security_check' 
grails.plugins.springsecurity.cas.filterProcessesUrl = '/j_spring_cas_security_check' grails.plugins.springsecurity.cas.key = 'my_key' 
grails.plugins.springsecurity.cas.sendRenew = false 
grails.plugins.springsecurity.cas.artifactParameter = 'ticket' 
grails.plugins.springsecurity.cas.serviceParameter = 'service' 
grails.plugins.springsecurity.cas.useSingleSignout = true  
grails.plugins.springsecurity.cas.proxyCallbackUrl = null 
grails.plugins.springsecurity.cas.proxyReceptorUrl = null 
grails.plugins.springsecurity.logout.afterLogoutUrl = 'http://server:8080/casserver/logout?url=http://localhost:8080/app/'

Y con eso ya podremos desplegar nuestro WAR sin problemas en nuestro server.

16 junio 2010

Deploy en GlassFish v3: Web Applications de Grails 1.1.1 y 1.3.1

GlassFish una excelente opción de código abierto: Deploy
Después de un rato de frustración por errores de configuración por fin logre desplegar más de 1 aplicación Web desarrolladas en Grails y con distintas versiones del framework (1.1.1 y 1.3.1). Para empezar hay dos forma de hacer un deploy en GlassFish, una en consola del SO y la otra con la consola de administración de GlassFish (Administration console). Yo uso la segunda opción por que es más fácil memorizar pantallas que comandos, pero no es bueno no tomar en cuenta lo poderosa que puede ser una consola en tareas administrativas con un grado mayor de complejidad.
Una vez que ya se haya instalado el GlassFish correctamente para hacer un deploy de forma rápida tenemos que ir a la sección de Applications en donde encontraremos un pequeño administrador para hacer deploy.
Pantalla 1 .- Consola de Administración de GlassFish en la sección de Applications

Al dar clic al botón deploy aparecerá un formulario donde tendremos que buscar en nuestro equipo el WAR que vamos a desplegar, el tipo de objeto que será desplegado, el nombre con que será llamado e identificado ,el servidor virtual donde se alojará, entre otras. Antes de querer desplegar una aplicación con Grails recomiendo descargar este HelloWorld y subirlo a GlassFish para estar seguros de que GlassFish está funcionando correctamente.
Pantalla 2.- Formulario para subir y desplegar un aplicación en GlassFish

 Al finalizar el deploy corremos la aplicación entrando a http://localhost/helloWorld o con la liga de Launch en la sección en donde empezamos (Applications).

Desplegar una aplicación Grails versión 1.1.1
Este escenario no necesita una configuración especial, sólo hay que seguir el proceso normal de deploy y no es obligatorio crear un WAR sin JARS (grails war --nojars). A diferencia de Tomcat, GlassFish si te permite montar varias Grails app con todos sus JARS pero el problema comienza cuando tienes aplicaciones con versión 1.2.2 a 1.3.1, hasta ahora con estás he tenido problemas; por lo general el mensaje de error es similar a esto: 
An error has occurred
There is no installed container capable of handling this application
com.sun.enterprise.deploy.shared.FileArchive@1e46947
Desplegar una aplicación Grails versión 1.3.1
El caso de aplicaciones de versión 1.3.1 es especial por que el archivo MANIFEST.MF que se genera en el WAR crea conflictos en el proceso de deploy que usa GlassFish. La solución o Workaround no está del lado de GlassFish sino en la cancha del core de Grails, por tanto tendremos que modificar un archivo de nombre _GrailsWar.groovy que se encuentra en /tu_grails_folder/scripts que es el script que se encarga de la construcción del WAR. Lo que hay que hacer es buscar las siguiente líneas y comentarlas:

 // OSGi bundle headers
attribute(name:"Bundle-ManifestVersion",value:"2") // <-- Está se comenta
attribute(name:"Bundle-Name",value:"${grailsAppName}") // <-- Está se comenta
attribute(name:"Bundle-SymbolicName",value:"${grailsAppName}") // <-- Está se comenta

 Entonces ahora cuando se construya un WAR con versión 1.3.1 el archivo MANIFEST.MF no tendrá los elementos que le crean conflictos al GlassFish. Ahora si, al hacer el WAR y desplegarlo en GlassFish no mostrará ningún mensaje de error y como dije esto es un WorkAround y es posible que pronto haya una mejor solución para esto.
Espero que esto le sea de utilidad y las fuentes del siguiente artículo son las siguientes:
Gails 1.2.2 and GlassFish

Update: La modificación del _GrailsWar.groovy funciona también para las versión 1.3.2 y 1.3.3 de Grails