Come accedere alla configurazione di Grails in Grails 2.0?

Ho ottenuto l’ultimo traguardo di Grails 2.0 e vedo un avviso di ritiro per la class ConfigurationHolder :

 org.codehaus.groovy.grails.commons.ConfigurationHolder 

Il messaggio di deprecazione dice semplicemente “Usa l’iniezione di dipendenza” invece 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 (come BootStrap ).

  • Se ne hai bisogno in un artefatto che supporta l’iniezione di dipendenza, semplicemente iniettare grailsApplication

     class MyController { def grailsApplication def myAction = { def bar = grailsApplication.config.my.property } } 
  • Se ne hai bisogno in un bean, ad esempio, src/groovy o src/java , conf/spring/resources.groovy 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’object di configurazione alla class che ne ha bisogno o passare le proprietà specifiche che sono 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) } } 

Aggiornare:

Burt Beckwith ha recentemente scritto un paio di post sul blog su questo. Si discute usando getDomainClass() da classi di dominio, mentre l’altro offre la possibilità di creare la propria class di getDomainClass() se nessuna delle soluzioni di cui sopra è appropriata).

Un’alternativa a grailsApplication è la class Holders ,

 import grails.util.Holders def config = Holders.config 

Ottieni config direttamente dai titolari, non è necessaria alcuna iniezione, il che è utile per le classi di utilità, ecc.

puoi inserire “grailsApplication” nel tuo file sorgente. ecco un esempio di conf / Bootstrap.groovy

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

Un altro modo non deprecato 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 è disponibile un genitore iniettato, come le classi servlet oi metodi statici.

Puoi accedere alla configurazione di Grails

  1. Nel 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 } } 

Puoi chiamare questo metodo di taglib in vista come

  1. In vista :

       Demo  ${grailsApplication.config.propertyInConfig}   

Per accedere dalla class di dominio fai:

 import grails.util.Holders // more code static void foo() { def configOption = Holders.config.myProperty }