Как получить доступ к конфигурации Grails в Grails 2.0? - PullRequest
63 голосов
/ 20 августа 2011

Я получил последний этап Grails 2.0 и вижу предупреждение об устаревании для ConfigurationHolder класса:

org.codehaus.groovy.grails.commons.ConfigurationHolder

Сообщение об устаревании просто говорит: «Используйте вместо этого внедрение зависимостей», что не оченьполезно для меня.Я понимаю внедрение зависимостей, но как мне подключить bean-компонент с правильной конфигурацией Grails, чтобы я мог получить к нему доступ во время выполнения?Мне нужно получить доступ к конфигурации из других мест, кроме моих контроллеров и тегов (например, BootStrap).

Ответы [ 6 ]

104 голосов
/ 21 августа 2011
  • Если вам это нужно в артефакте, поддерживающем внедрение зависимостей, просто введите grailsApplication

    class MyController {
        def grailsApplication
    
        def myAction = {
            def bar = grailsApplication.config.my.property
        }
    }
    
  • Если вам это нужно в бине,скажем, 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)
        }
    }
    

Обновление:

Берт Беквит недавно написалпара постов в блоге по этому вопросу. В одном обсуждается использование getDomainClass() в пределах классов домена, в то время как в другом предлагается создание собственного класса владельца (если ни одно из указанных выше решений не подходит).

57 голосов
/ 05 апреля 2013

Альтернативой grailsApplication является класс Holders ,

import grails.util.Holders

def config = Holders.config

Вы получаете конфигурацию непосредственно с Holders, не требуется инъекция, что удобно для служебных классов и т. Д.

18 голосов
/ 21 августа 2011

вы можете добавить "grailsApplication" в ваш исходный файл.вот пример конф / Bootstrap.groovy

class BootStrap {

    def grailsApplication

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

    def destroy = {
    }
}
10 голосов
/ 22 мая 2012

Еще один не осуждаемый способ получить конфигурацию:

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

Это работает в ситуациях, когда нет доступных встроенных родительских элементов, таких как классы сервлетов или статические методы.

4 голосов
/ 02 сентября 2014

Вы можете получить доступ к конфигурации Grails

  1. В контроллере

    class DemoController {
        def grailsApplication
    
        def demoAction = {
            def obj = grailsApplication.config.propertyInConfig
        }
    }
    
  2. В услугах:

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

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

Вы можете вызвать этот метод taglib в виде <cd:demoMethod/>

  1. В поле зрения:

     <html>
         <head><title>Demo</title></head>
     <body>
         ${grailsApplication.config.propertyInConfig}
     </body>
    
     </html>
    
0 голосов
/ 25 августа 2017

Для доступа из класса домена выполните:

import grails.util.Holders

// more code

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