2011-08-20 17 views
63

que han obtenido los últimos Grails 2.0 hito, y yo estoy viendo una advertencia desaprobación para la clase ConfigurationHolder:¿Cómo acceder a la configuración de Grails en Grails 2.0?

org.codehaus.groovy.grails.commons.ConfigurationHolder 

El mensaje de desaprobación simplemente dice "Use inyección de dependencias lugar" que no es muy útil para mí. Entiendo la inyección de dependencia, pero ¿cómo puedo conectar un bean con la configuración adecuada de Grails para poder acceder a él en tiempo de ejecución? Necesito acceder a la configuración desde otros lugares que no sean mis Controladores y Etiquetas (como BootStrap).

Respuesta

101
  • Si lo necesita en un artefacto que es compatible con la inyección de dependencias, simplemente inyectar grailsApplication

    class MyController { 
        def grailsApplication 
    
        def myAction = { 
         def bar = grailsApplication.config.my.property 
        } 
    } 
    
  • Si lo necesita en un grano de , por ejemplo, src/groovy o src/java, alambre hacia arriba usando conf/spring/resources.groovy

    // src/groovy/com/example/MyBean.groovy 
    class MyBean { 
        def grailsApplication 
    
        def foo() { 
         def bar = grailsApplication.config.my.property 
        } 
    } 
    
    // resources.groovy 
    beans = { 
        myBean(com.example.MyBean) { 
         grailsApplication = ref('grailsApplication') 
         // or use 'autowire' 
        } 
    } 
    
  • En cualquier otro lugar, probablemente sea más fácil pasar el objeto de configuración a la clase que lo necesita o pasar las propiedades específicas que se necesitan.

    // src/groovy/com/example/NotABean.groovy 
    class NotABean { 
        def foo(def bar) { 
         ... 
        } 
    } 
    
    // called from a DI-supporting artifact 
    class MyController { 
        def grailsApplication 
        def myAction = { 
         def f = new NotABean() 
         f.foo(grailsApplication.config.my.property) 
        } 
    } 
    

Actualización:

Burt Beckwith escribió recientemente un par de entradas de blog en esto. One discusses usinggetDomainClass() desde clases de dominio, mientras que el otro ofrece la opción creating your own holder class (si ninguna de las soluciones anteriores es apropiada).

+0

Rob, respuesta muy útil. Gracias. – Polaris878

18

puede inyectar "aplicación de grial" en su archivo de origen. aquí es una muestra de conf/Bootstrap.groovy

class BootStrap { 

    def grailsApplication 

    def init = { servletContext -> 
     println grailsApplication.config 
    } 

    def destroy = { 
    } 
} 
+0

+1, muy buena sugerencia! – Polaris878

10

Otra forma no desaprobado para obtener la configuración es:

ApplicationContext context = ServletContextHolder.servletContext. 
     getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT) 
     as ApplicationContext 
    ConfigObject config = context.getBean(GrailsApplication).config 

Esto funciona en situaciones donde no hay una matriz inyectada disponibles, tales como clases de servlet o métodos estáticos.

56

Una alternativa a grailsApplication es el Holders clase,

import grails.util.Holders 

def config = Holders.config 

Usted get config directamente fuera de los titulares, sin inyección necesaria, lo cual es bueno para las clases de servicios públicos, etc.

+0

Esta es probablemente la forma más sencilla, ya que hay una asignación directa de 1: 1 a la clase obsoleta. – Andrew

+1

¿Cuándo es preferible 'grails.util.Holders' a inyectar' grailsApplication'? –

+2

@AlexanderSuraphel cuando no desee que Spring controle el ciclo de vida de su bean. Por ejemplo, una clase de utilidad con métodos públicos estáticos. –

4

Puede acceder a la configuración griales

  1. En Controlador

    class DemoController { 
        def grailsApplication 
    
        def demoAction = { 
         def obj = grailsApplication.config.propertyInConfig 
        } 
    } 
    
  2. En servicios:

    class DemoService { 
        def grailsApplication 
    
        def demoMethod = { 
         def obj = grailsApplication.config.propertyInConfig 
        } 
    } 
    
  3. En taglib:

    class DemoTaglib { 
        def grailsApplication 
    
        static namespace = "cd" 
    
        def demoMethod = { 
    
         def obj = grailsApplication.config.propertyInConfig 
    
         out << obj  
        } 
    } 
    

Usted puede llamar a este método de taglib a la vista como <cd:demoMethod/>

  1. En vista:

    <html> 
        <head><title>Demo</title></head> 
    <body> 
        ${grailsApplication.config.propertyInConfig} 
    </body> 
    
    </html> 
    
0

Para acceder desde la clase de dominio do:

import grails.util.Holders 

// more code 

static void foo() { 
    def configOption = Holders.config.myProperty 
} 
Cuestiones relacionadas