Recursos estáticos en #grails

Cuando se necesita usar un recurso estático en una clase java generalmente se usa un llamado a getResource*:

Class.getResourceAsStream("/ruta/archivo") //null
ClassLoader.getResourceAsStream("/ruta/archivo") //null
ClassLoader.getResource("/ruta/archivo").openStream() //null
this.class.getResource("/ruta/archivo") //esta debería funcionar
Thread.currentThread().contextClassLoader.getResourceAsStream("/ruta/archivo") //debería funcionar

en grails nuestros recursos estáticos deben encontrarse en la ruta src/java para que se encuentren disponibles tanto para todos los entornos (incluidas pruebas unitarios), sin embargo, el uso de las alternativas anteriores no aprovecha la interfaz de Spring org.springframework.core.io.Resource que nos varias ventajas sobre la carga normal de recursos.

Para hacerlo existen varias formas, entre ellas:

ApplicationHolder.application.parentContext.getResource("classpath:$filePath") //deprecated desde 2.0
new UrlResource( StaticResourceLoader.getResource("/ruta/archivo")) //mi preferida

La última opcion hace uso de la clase StaticResourceLoader disponible desde la versión 1.2 de grails y tiene como ventajas extra el evitar usar clases deprecated y permitir ser usada en test unitarios sin tener que hacer ningun mock.

Anuncios