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
).
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 ).
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.
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 = {
}
}
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.
Vous pouvez accéder à la configuration des grails
Dans le contrôleur
class DemoController {
def grailsApplication
def demoAction = {
def obj = grailsApplication.config.propertyInConfig
}
}
Dans les services:
class DemoService {
def grailsApplication
def demoMethod = {
def obj = grailsApplication.config.propertyInConfig
}
}
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/>
En vue :
<html>
<head><title>Demo</title></head>
<body>
${grailsApplication.config.propertyInConfig}
</body>
</html>
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
}