web-dev-qa-db-fra.com

Comment accéder à la configuration de Grails dans Grails 2.0?

J'ai obtenu le dernier jalon Grails 2.0 et je vois un avertissement de dépréciation pour la classe ConfigurationHolder:

org.codehaus.groovy.grails.commons.ConfigurationHolder

Le message de dépréciation dit simplement "Utilisez plutôt l'injection de dépendance", ce qui ne m'a pas été très utile. Je comprends l'injection de dépendance, mais comment puis-je câbler un bean avec la configuration Grails appropriée pour pouvoir y accéder au moment de l'exécution? J'ai besoin d'accéder à la configuration à partir d'autres endroits que mes contrôleurs et balises (tels que BootStrap).

63
Polaris878
  • Si vous en avez besoin dans un artefact prenant en charge l'injection de dépendances, injectez simplement grailsApplication

    class MyController {
        def grailsApplication
    
        def myAction = {
            def bar = grailsApplication.config.my.property
        }
    }
    
  • Si vous en avez besoin dans un bean, disons, src/groovy Ou src/Java, Câblez-le en utilisant 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'
        }
    }
    
  • Partout ailleurs, il est probablement plus simple de passer l'objet de configuration à la classe qui en a besoin ou de transmettre les propriétés spécifiques nécessaires.

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

Mise à jour:

Burt Beckwith a récemment écrit quelques articles de blog à ce sujet. L'un discute de l'utilisationgetDomainClass() à partir des classes de domaine, tandis que l'autre offre la possibilité de créer votre propre classe de support (si aucune des solutions ci-dessus n'est appropriée ).

104
Rob Hruska

Une alternative à grailsApplication est la classe Holders ,

import grails.util.Holders

def config = Holders.config

Vous obtenez la configuration directement des titulaires, aucune injection n'est nécessaire, ce qui est bien pour les classes utilitaires, etc.

57
James McMahon

vous pouvez injecter "grailsApplication" dans votre fichier source. voici un exemple de conf/Bootstrap.groovy

class BootStrap {

    def grailsApplication

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

    def destroy = {
    }
}
18
Mengu

Une autre façon non obsolète d'obtenir la configuration est:

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

Cela fonctionne dans les situations où aucun parent injecté n'est disponible, comme les classes de servlet ou les méthodes statiques.

10
Ingo Kegel

Vous pouvez accéder à la configuration des grails

  1. Dans le contrôleur

    class DemoController {
        def grailsApplication
    
        def demoAction = {
            def obj = grailsApplication.config.propertyInConfig
        }
    }
    
  2. Dans les services:

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

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

Vous pouvez appeler cette méthode de taglib en vue comme <cd:demoMethod/>

  1. En vue :

     <html>
         <head><title>Demo</title></head>
     <body>
         ${grailsApplication.config.propertyInConfig}
     </body>
    
     </html>
    
4
Prabhat Kashyap

Pour accéder à partir de la classe de domaine, procédez comme suit:

import grails.util.Holders

// more code

static void foo() {
  def configOption = Holders.config.myProperty
}
0
cristian.d