Как получить доступ к конфигурации Grails в Grails 2.0?


я получил последнюю веху Grails 2.0, и я вижу предупреждение об устаревании для ConfigurationHolder класс:

org.codehaus.groovy.grails.commons.ConfigurationHolder

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

6 63

6 ответов:

  • Если вам это нужно в артефакте, который поддерживает инъекцию зависимостей, просто введите 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() из классов домена, в то время как другой предлагает опцию создание собственного класса держателя (если ни одно из приведенных выше решений не подходит).

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

import grails.util.Holders

def config = Holders.config

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

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

class BootStrap {

    def grailsApplication

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

    def destroy = {
    }
}

еще один не устаревший способ получить конфигурацию:

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

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

вы можете получить доступ к конфигурации 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>
    

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

import grails.util.Holders

// more code

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