Как получить информацию Config.groovy из объекта домена или из статической области? Сейчас я использую ConfigurationHolder.config.*, но это и ApplicationHolder устарели, поэтому я хотел бы "сделать это правильно"... но объект grailsApplication недоступен в области DO/static.
получение информации о конфигурации Grails 2.0.0M1 в объекте домена и статической области?
Ответы (4)
Я бы добавил grailsApplication
в метакласс классов предметной области — это то, что я думаю сделать для финальной версии 2.0. А пока поместите его в BootStrap.groovy
, например.
class BootStrap {
def grailsApplication
def init = { servletContext ->
for (dc in grailsApplication.domainClasses) {
dc.clazz.metaClass.getGrailsApplication = { -> grailsApplication }
dc.clazz.metaClass.static.getGrailsApplication = { -> grailsApplication }
}
}
}
Затем вы можете получить доступ к конфигурации из grailsApplication.config
, а Spring beans через grailsApplication.mainContext.getBean('foo')
или просто grailsApplication.mainContext.foo
.
grails.util.Holders
, упомянутый Яном Робертсом, новым предпочтительным способом сделать это?
- person James McMahon; 21.08.2013
Заменой Grails 2 устаревших ApplicationHolder
, ConfigurationHolder
и т. д. является grails.util.Holders
, что обеспечивает та же функциональность, но безопасным способом, когда несколько разных веб-приложений в одном контейнере совместно используют одну копию JAR-файлов Grails в родительском загрузчике классов (в этом случае старые держатели вышли из строя).
import grails.util.Holders
// ...
static void foo() {
def configOption = Holders.config.myapp.option
}
Я действительно хотел получить доступ к конфигурации только в статических утилитах. После поиска и прочтения большинства ответов на SO я нашел простое решение (может быть кому-то полезно):
Добавьте класс держателя в src/groovy:
class StaticContext {
static def app;
}
инициализировать его в начальной загрузке
class BootStrap {
def grailsApplication
def init = { servletContext ->
StaticContext.app = grailsApplication
}
def destroy = {
}
}
И получить к нему доступ в статических утилитах:
//In my case Solr URL in single ton
def solrUrl = StaticContext.app.config.solr.url
В Grails 2.2.5 я обнаружил, что это будет работать:
Настройте свою переменную в
grails-app/conf/Config.groovy
, в разделе, соответствующем вашей среде. Например:environments { ... development { ... grails.config.myUrl = "http://localhost:3000" ...
...
Чтобы получить доступ:
import grails.util.Holders class myClass { ... def static myStaticMethod() { def myVar = Holders.config.grails.config.myUrl ...