2011-08-20 11 views
63

ho ottenuto le ultime Grails 2.0 traguardo, e sto vedendo un avviso di disapprovazione per la classe ConfigurationHolder:Come accedere alla configurazione di Grails in Grails 2.0?

org.codehaus.groovy.grails.commons.ConfigurationHolder 

Il messaggio di disapprovazione dice semplicemente "Usa l'iniezione di dipendenza, invece", che non è molto utile per me. Capisco l'iniezione di dipendenza, ma come posso cablare un bean con la corretta configurazione di Grails in modo che possa accedervi in ​​fase di runtime? Devo accedere alla configurazione da posizioni diverse dai miei controller e tag (ad esempio BootStrap).

risposta

101
  • Se avete bisogno in un manufatto che supporta l'iniezione di dipendenza, è sufficiente iniettare grailsApplication

    class MyController { 
        def grailsApplication 
    
        def myAction = { 
         def bar = grailsApplication.config.my.property 
        } 
    } 
    
  • Se ne avete bisogno in un fagiolo in , dire, src/groovy o src/java, legare uno 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' 
        } 
    } 
    
  • Ovunque, è probabilmente più semplice passare l'oggetto di configurazione alla classe che ne ha bisogno o passare le proprietà specifiche necessarie.

    // 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) 
        } 
    } 
    

Aggiornamento:

Burt Beckwith recentemente ha scritto un paio di post di blog su questo. One discusses usinggetDomainClass() all'interno delle classi di dominio, mentre l'altro offre l'opzione di creating your own holder class (se nessuna delle soluzioni precedenti è appropriata).

+0

Rob, risposta molto utile. Grazie. – Polaris878

18

è possibile inserire "grailsApplication" nel file sorgente. qui è un campione conf/Bootstrap.groovy

class BootStrap { 

    def grailsApplication 

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

    def destroy = { 
    } 
} 
+0

+1, ottimo suggerimento! – Polaris878

10

altro modo non obsoleto per ottenere la configurazione è:

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

Questo funziona in situazioni in cui non c'è nessun genitore iniettata disponibili, ad esempio classi servlet o metodi statici.

56

Un'alternativa a grailsApplication è il Holders di classe,

import grails.util.Holders 

def config = Holders.config 

Si ottiene config direttamente fuori di titolari, nessuna iniezione necessario, che è bello per classi di utilità, ecc

+0

Questo è probabilmente il modo più diretto, poiché esiste un mapping 1: 1 diretto alla classe deprecata. – Andrew

+1

Quando è preferibile 'grails.util.Holders 'per iniettare' grailsApplication'? –

+2

@AlexanderSuraphel quando non vuoi che Spring controlli il ciclo di vita del tuo bean. Ad esempio, una classe di utilità con metodi statici pubblici. –

4

È possibile accedere alla configurazione graal

  1. controller

    class DemoController { 
        def grailsApplication 
    
        def demoAction = { 
         def obj = grailsApplication.config.propertyInConfig 
        } 
    } 
    
  2. Nei servizi:

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

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

È possibile chiamare questo metodo di taglib in vista, come <cd:demoMethod/>

  1. In considerazione:

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

Per accedere dalla classe di dominio do:

import grails.util.Holders 

// more code 

static void foo() { 
    def configOption = Holders.config.myProperty 
} 
Problemi correlati