Как получить доступ к конфигурации Grails в Grails 2.0?
Я получил последнюю версию Grails 2.0, и я вижу предупреждение об отказе для класса ConfigurationHolder
:
org.codehaus.groovy.grails.commons.ConfigurationHolder
Сообщение об отказе просто говорит "Использовать инъекцию зависимостей", что не очень полезно для меня. Я понимаю инъекцию зависимостей, но как я могу подключить bean с надлежащей конфигурацией Grails, чтобы я мог получить к ней доступ во время выполнения? Мне нужно получить доступ к конфигурации из других мест, кроме моих контроллеров и тэгов (например, BootStrap
).
Ответы
Ответ 1
-
Если вам это нужно в артефакте, поддерживающем инъекцию зависимостей, просто введите grailsApplication
class MyController {
def grailsApplication
def myAction = {
def bar = grailsApplication.config.my.property
}
}
-
Если вам это нужно в bean в, скажем, src/groovy
или src/java
, подключите его, используя 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'
}
}
-
В любом другом месте, возможно, проще всего передать объект конфигурации классу, который ему нужен, или передать необходимые свойства.
// 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)
}
}
Update:
Берт Беквит недавно написал пару сообщений в блоге об этом. Обсуждается использование getDomainClass()
из классов домена, а в другом - опция создавая собственный класс владельца (если ни одно из вышеперечисленных решений не подходит).
Ответ 2
Альтернативой grailsApplication является Holders класс,
import grails.util.Holders
def config = Holders.config
Вы получаете конфигурацию непосредственно от держателей, без необходимости в инъекции, что хорошо для классов полезности и т.д.
Ответ 3
вы можете ввести "grailsApplication" в исходный файл. здесь приведен пример conf/Bootstrap.groovy
class BootStrap {
def grailsApplication
def init = { servletContext ->
println grailsApplication.config
}
def destroy = {
}
}
Ответ 4
Еще один непринужденный способ получить конфигурацию:
ApplicationContext context = ServletContextHolder.servletContext.
getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT)
as ApplicationContext
ConfigObject config = context.getBean(GrailsApplication).config
Это работает в ситуациях, когда нет доступного родителя, такого как классы сервлетов или статические методы.
Ответ 5
Вы можете получить доступ к конфигурации графиков
-
В контроллере
class DemoController {
def grailsApplication
def demoAction = {
def obj = grailsApplication.config.propertyInConfig
}
}
-
В сервисах:
class DemoService {
def grailsApplication
def demoMethod = {
def obj = grailsApplication.config.propertyInConfig
}
}
-
В taglib:
class DemoTaglib {
def grailsApplication
static namespace = "cd"
def demoMethod = {
def obj = grailsApplication.config.propertyInConfig
out << obj
}
}
Вы можете вызвать этот метод taglib в виде <cd:demoMethod/>
-
В поле зрения:
<html>
<head><title>Demo</title></head>
<body>
${grailsApplication.config.propertyInConfig}
</body>
</html>
Ответ 6
Для доступа из класса домена выполните:
import grails.util.Holders
// more code
static void foo() {
def configOption = Holders.config.myProperty
}