2012-01-19 82 views
1

以下是方案。我的Grails應用程序之外有一個包含url/username/password/etc的文件。信息,以便開發人員無法查看生產的連接信息。我包括在實踐中Config.groovy中這樣的信息:Grails 2.0使用POGO中外部文件的配置值

grails.config.locations << "file:" + "C:/directory/from/env/variable/data.properties" 

然後,我在POGO通過訪問此信息:

import org.codehaus.groovy.grails.commons.ConfigurationHolder 
... 
ConfigurationHolder.config.url 
ConfigurationHolder.config.userName 
ConfigurationHolder.config.password 

升級到Grails的2.0後,我注意到,ConfigurationHolder是棄用。所以我去了文檔:(http://grails.org/doc/latest/guide/conf.html)試圖找出如何解決它。文檔說使用grailsApplication獲取配置值。我的問題是,我在POGO中,而grails應用程序的Grails自動裝配沒有被調用。我的問題有2個部分:

1)在POGO中有沒有更好的方式從文件中獲取配置信息?

2)如果沒有更好的方法,我該如何將grailsApplication注入到POGO中?

其他信息: 我正在使用Grails GLDAPO插件(http://gldapo.codehaus.org/)與LDAP目錄進行接口。我試圖讓這些對象(我放在/ src/groovy下)的行爲與域對象相同,因爲我可以使用靜態方法來做findBy...(..)。有了你建議的模式,我必須通過服務來獲取數據。這並不壞,它只是不如Groovy :)

回答

5

基於更新後的問題的新答案。

您有幾個選項。一個是在grailsApplication到元類這些類,即金屬絲在BootStrap.groovy

class BootStrap { 

    def grailsApplication 

    def init = { servletContext -> 
     YourClass.metaClass.getGrailsApplication = { -> grailsApplication } 
    } 
} 

這將增加一個getGrailsApplication方法,其可作爲grailsApplication屬性進行訪問。

另一種選擇是一個靜態grailsApplication字段添加到這些類,並設置在BootStrap

class BootStrap { 

    def grailsApplication 

    def init = { servletContext -> 
     YourClass.grailsApplication = grailsApplication 
    } 
} 

也看到this blog post,討論創建持有者類和this one,討論重載構造函數。

+0

感謝@BurtBeckwith的輸入! –

0

您必須從一個可以依賴注入grailsApplication bean的工件調用它,至少是間接的。將def grailsApplication添加到服務或Quartz作業或任何正在調用您的POGO並將grailsApplication.config傳遞給需要它的方法調用或者一次調用setter。

+0

感謝您的回覆,我添加了一些額外的信息。你可以看一看,看看有沒有辦法避免通過服務實現數據訪問?感謝您的反饋btw! –