Alba on Tech

Talking about technology

Grails 3 gotchas

La versión 3 de Grails salió hace pocos meses, pero no había tenido oportunidad de probarla hasta ahora. Aprovechando un hueco entre proyectos, y que quería reescribir una aplicación interna para ver si la sacamos al mundo, decidí darle una oportunidad.

Las primeras impresiones han sido buenas: Está basado en spring boot, es más modular, me da la impresión de que arranca antes y consume menos RAM (no lo he verificado), y en general es muy prometedor. Pero sin embargo tiene algunos “gotchas” que hacen que empezar sea un poco más complicado de lo que debería.

1- Configuración externa

Externalizar parte de la configuración de una aplicación a un fichero externo es algo vital. Sirve por ejemplo para almacenar de forma separada los passwords de bases de datos, o cuentas de email, o claves de amazon, o muchas otras cosas que no deben ir a tu repositorio de código. En versiones anteriores de Grails definir un fichero externo a tu aplicación donde configurar elementos, o sobreescribir configuraciones internas es muy sencillo. En Grails 3 no lo es tanto.

 

Por fortuna, tiene solución. Una buena referencia de la misma está en este gist. Aunque aquí dejo mi propia versión, algo más simplificada, que lee un fichero de configuración llamado “.config-app.yml” de la home del usuario que ejecuta la aplicación:

Fichero Application.groovy

class Application extends GrailsAutoConfiguration {
    static String DEFAULT_DWBH_CONFIG_PATH = System.getProperty('user.home') + 
                                             System.getProperty('file.separator') + 
                                             '.config-app.yml'

    static void main(String[] args) {
        GrailsApp.run(Application, args)
    }


    @Override
    void setEnvironment(Environment environment) {
        Resource resourceConfig = new FileSystemResource(DEFAULT_DWBH_CONFIG_PATH)
        YamlPropertiesFactoryBean ypfb = new YamlPropertiesFactoryBean()
        ypfb.setResources([resourceConfig] as Resource[])
        ypfb.afterPropertiesSet()
        Properties properties = ypfb.getObject()
        environment.propertySources.addFirst(new PropertiesPropertySource("local.config.location", properties))
    }
}

2- Ver la salida de los test de spock por consola

Yo en general tiendo a usar mucho la línea de comandos. Por ejemplo, siempre ejecuto los test en línea de comandos, en lugar de usar un IDE o similar. Esto me permite un control muy fino sobre los tests que quiero ejecutar. El problema es que al ejecutar los tests de Grails 3:

grails test-app

Nos encontramos con que los tests de spock por defecto no sacan información en consóla. Es decir, avisan del fallo, pero todo lo que te dicen son cosas cómo:

dwbh.user.GroupServiceSpec > Add user to group FAILED
    org.spockframework.runtime.SpockComparisonFailure at GroupServiceSpec.groovy:47

Lo cual es una pena, porque una de las maravillas de spock es la cantidad de información que te da cuando falla un test. Es cierto que siempre se puede ver el informe web (en el fichero build/reports/tests/index.html), pero para mi es mucho más eficiente ver los fallos directamente en consola. Y para ello hay que añadir lo siguiente:

Para poder verlo, hay que añadir:

Fichero build.gradle

test {
    testLogging {
        exceptionFormat = 'full'
    }
}

Y así conseguiremos resultados mucho más útiles:

dwbh.user.GroupServiceSpec > Add user to group FAILED
    Condition not satisfied:

    UserGroup.count() == 2
              |       |
              1       false
        at dwbh.user.GroupServiceSpec.Add user to group(GroupServiceSpec.groovy:47)

3-Mensajes perdidos de messages.properties

En un par de ocasiones he perdido un rato largo por un error absurdo, que no recuerdo haber tenido en Grails 2: nuevos mensajes añadidos al messages.properties no se renderizan. Por ejemplo es habitual que ocurra cuando te traes cambios al hacer un pull de git.

La solución es simplemente hacer:

grails clean

4-En el plugin de springsecurity, no funciona la anotación @Secured para urls personalizadas

Esto está aún sin solución hay una issue abierta: https://github.com/grails-plugins/grails-spring-security-core/issues/373.

Por ahora, lo que hago es poner todas las referencias a urls como controller+action, por ejemplo

<g:link controller="group" action="create"><g:message code="default.new" /></g:link>

Y eso es todo por ahora. Seguiré avanzando con Grails 3, y si encuentro más cositas, habrá una segunda parte.

Advertisements

5 November, 2015 - Posted by | Uncategorized

3 Comments »

  1. Interesante post, gracias por compartirlo.

    Respecto al punto 2, eso ocurre porque Gradle es así. Te ocurre lo mismo en cualquier otro proyecto Gradle (Spring Boot o lo que sea). Te recomiendo este artículo del gran MrHaki: http://mrhaki.blogspot.com.es/2014/10/gradle-goodness-show-standard-out-or.html

    Respecto al punto 4, el plugin de Spring Security para Grails 3 está en una versión muy preliminar. Esperemos que eso cambie próximamente, if you know what I mean 😛

    Comment by Álvaro Sánchez-Mariscal | 5 November, 2015 | Reply

  2. Gracias, Álvaro.

    Lo del punto 2, efectivamente es así, pero estaría muy bien que en la configuración por defecto de grails añadieran ese bloque…

    Y el punto 4, pues estaría genial que alguien con mano en grails y en el plugin le echara un vistazo, ¿eh? wink, wink 😉

    Comment by Pablo Alba | 6 November, 2015 | Reply

  3. Bueno, más que mano en Grails, lo que hay que tener es tiempo para contribuir, algo que afortunadamente ahora tengo, pero que no es exclusivo de mí 🙂

    Comment by Álvaro Sánchez-Mariscal | 9 November, 2015 | Reply


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: