在域对象和静态范围中获取grails 2.0.0M1配置信息?

在域对象和静态范围中获取grails 2.0.0M1配置信息?,grails,grails-domain-class,Grails,Grails Domain Class,如何从域对象或静态范围获取Config.groovy信息?我现在使用的是ConfigurationHolder.config.*但是它和ApplicationHolder都不推荐使用,所以我想“正确使用”。。。但是grailsApplication对象在DO/静态范围内不可用。我想将grailsApplication添加到域类的元类中——这是我考虑为2.0 final做的事情。现在,把它放在BootStrap.groovy中 class BootStrap { def grailsApp

如何从域对象或静态范围获取Config.groovy信息?我现在使用的是ConfigurationHolder.config.*但是它和ApplicationHolder都不推荐使用,所以我想“正确使用”。。。但是grailsApplication对象在DO/静态范围内不可用。

我想将
grailsApplication
添加到域类的元类中——这是我考虑为2.0 final做的事情。现在,把它放在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
访问配置,通过
grailsApplication.mainContext.getBean('foo')
或只通过
grailsApplication.mainContext.foo
访问Springbeans,我真的只想在静态实用程序中访问配置。在搜索和阅读了SO的大部分答案后,我得出了一个简单的解决方案(可能对某些人有用):

在src/groovy下添加holder类:

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

Grails 2取代了不推荐使用的
ApplicationHolder
ConfigurationHolder
等,它提供了相同的功能,但在同一容器中的多个不同WebApp在父类加载器中共享Grails JAR的单个副本时是安全的(这是旧持有人破产的情况)


在Grails2.2.5中,我发现这是可行的:

  • 在适用于您的环境的部分的
    grails app/conf/Config.groovy
    中配置您的变量。例如:

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

  • 要访问:

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

  • 好主意…但是,启动失败的原因是“起因:org.hibernate.InstantiationException:无法实例化TestObjectQdcore.UserCallFlow”(qdcore.UserCallFlow是一个域类),因为hibernate似乎在引导运行之前做了一些事情。为了避免这个问题,我使用了安全的deref(例如,grailsApplication?.config?.qdcore?.servers?.upload?.url),这样Hibernate就可以运行引导程序,然后grailsApplication就可以使用了。谢谢!但是,即使在DO中有安全的deref(def grailsApplication;def config=grailsApplication?.config;def String usrv=config?.qdcore?.servers?.upload?.url)我得到的是空值,所以我还没有正确地使用它——我会在整理好自己后再发回来;)工作原理是使用grailsApplication的静态范围,其余的使用实例范围;例如,类UCF{static grailsApplication;def config=grailsApplication?.config;def String usrv=config?.qdcore?.servers?.upload?.url…}我不能将静态作用域用于其他应用程序,因为我得到了“grailsApplication”的异常当我试图获取它的config属性时,它为null。这可能有点令人不安,但它适用于这个原型应用程序!Burt,请在Grails 2.0的DCs中包含grailApplication,这将是一个方便、简洁和有用的方法addition@BurtBeckwith,是Ian Roberts提到的
    grails.util.Holders
    方法,它是实现他的?这在quartz计划作业的静态触发器块中特别有用。谢谢!这也适用于域中的hibernate映射,以便从外部属性文件配置内容。谢谢。
    import grails.util.Holders
    
    class myClass {
    ...
    
       def static myStaticMethod() {
          def myVar = Holders.config.grails.config.myUrl
    ...