2011-08-08 68 views

回答

8

我會將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訪問配置和Spring豆。

+0

好主意......但是,啓動失敗,並「產生的原因:org.hibernate.InstantiationException:無法實例化測試objectqdcore.UserCallFlow「(qdcore.UserCallFlow是一個域類),因爲看起來Hibernate在Bootstrap運行之前做了一些事情。爲了解決這個問題,我使用安全的deref(例如,grailsApplication?.config?.qdcore?.servers?.upload?.url),以便Hibernate很開心,Bootstrap可以運行,然後grailsApplication可用。謝謝! – Wayne

+0

但是,即使安全的deref在DO(def grailsApplication; def config = grailsApplication?.config; def String usrv = config?.qdcore?.servers?.upload?.url)我得到空值, m沒有正確使用它,當然 - 當我將自己整理出來時,我會回來;) – Wayne

+0

在DO中起作用的是爲grailsApplication使用靜態作用域,其餘的實例作用域;例如,類UCF {static grailsApplication; def config = grailsApplication?.config; def String usrv = config?.qdcore?.servers?.upload?.url ...}我不能爲其他人使用靜態作用域,因爲當我嘗試獲取其配置屬性時,我會遇到「grailsApplication」爲空的異常。這可能有點瑣碎,但它適用於這個原型應用程序! – Wayne

1

我真的只想在靜態工具中訪問配置。搜索和閱讀最上SO的答案後,我帶着簡單的解決方案(可能對別人有用):在src

添加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 
19

Grails的2 repla已過時的ApplicationHolder,ConfigurationHolder等的水泥是grails.util.Holders,它提供了相同的功能,但是在同一個容器中的幾個不同的webapps在父類加載器中共享單個Grails JAR副本時,這種方式是安全的(這是舊持有人破產的情況)。

import grails.util.Holders 

// ... 

static void foo() { 
    def configOption = Holders.config.myapp.option 
} 
+0

這對石英預定作業的靜態觸發器塊特別有用。謝謝! – Gary

+0

這也適用於域中的hibernate映射,以便從外部屬性文件中配置相關的東西。謝謝。 – Eduard

1

在Grails的2.2.5,我發現這會工作:

  1. 配置您的變量grails-app/conf/Config.groovy,在部分appropiate您的環境。例如:

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