Как получить доступ к конфигурации 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/>

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

     <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
}