получение информации о конфигурации Grails 2.0.0M1 в объекте домена и статической области?

Как получить информацию Config.groovy из объекта домена или из статической области? Сейчас я использую ConfigurationHolder.config.*, но это и ApplicationHolder устарели, поэтому я хотел бы "сделать это правильно"... но объект grailsApplication недоступен в области DO/static.


person Wayne    schedule 08.08.2011    source источник


Ответы (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.

person Burt Beckwith    schedule 08.08.2011
comment
Хорошая идея ... но запуск завершается с ошибкой. Причина: org.hibernate.InstantiationException: не удалось создать экземпляр тестового объекта qdcore.UserCallFlow (qdcore.UserCallFlow — это класс домена), поскольку кажется, что Hibernate что-то делает до запуска Bootstrap. Чтобы обойти это, я использую безопасный deref (например, grailsApplication?.config?.qdcore?.servers?.upload?.url ), чтобы Hibernate был доволен, Bootstrap запустился, а затем GrailsApplication стал доступен. Спасибо! - person Wayne; 08.08.2011
comment
Но даже с безопасным deref в DO (def grailsApplication; def config=grailsApplication?.config; def String usrv = config?.qdcore?.servers?.upload?.url) я получаю нулевые значения, поэтому я пока не использую его правильно - я отпишусь, когда разберусь;) - person Wayne; 08.08.2011
comment
Что работает в DO, так это использование статической области для приложения GrailsApplication и области экземпляра для остальных; например, class UCF { static GrailsApplication; def config=grailsApplication?.config; def String usrv = config?.qdcore?.servers?.upload?.url ...} Я не могу использовать статическую область для других, так как тогда я получаю исключения, что grailsApplication имеет значение null, когда я пытаюсь получить его свойство конфигурации. Возможно, это немного нервно, но это работает для этого приложения для прототипирования! - person Wayne; 08.08.2011
comment
Берт, пожалуйста, включите приложение grail в контроллеры домена в Grails 2.0, это было бы удобным, лаконичным и полезным дополнением. - person virtualeyes; 06.10.2011
comment
@ Берт Беквит, является ли метод 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
}
person Ian Roberts    schedule 28.05.2013
comment
Это было особенно полезно в блоке статических триггеров плановых заданий кварца. Спасибо! - person Gary; 27.06.2013
comment
Это также работает в сопоставлениях гибернации в домене, чтобы можно было настроить что-то из внешнего файла свойств. Спасибо. - person Eduard; 20.08.2013

Я действительно хотел получить доступ к конфигурации только в статических утилитах. После поиска и прочтения большинства ответов на 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
person Thamme Gowda    schedule 28.05.2013

В Grails 2.2.5 я обнаружил, что это будет работать:

  1. Настройте свою переменную в grails-app/conf/Config.groovy, в разделе, соответствующем вашей среде. Например:

    environments {
    ...
      development {
      ...
        grails.config.myUrl = "http://localhost:3000"
        ...
    

    ...

  2. Чтобы получить доступ:

    import grails.util.Holders
    
    class myClass {
    ...
    
       def static myStaticMethod() {
          def myVar = Holders.config.grails.config.myUrl
    ...
    
person AlejandroVD    schedule 10.09.2014