2011-08-24 77 views
3

Grails 1.3.7第一次加載Grails外部配置讀取不正確

我有一些配置位於外部配置文件。其中一個看起來像這樣:

site.maintenance.mode = false 

我有一個過濾器,檢查特定URL的某些配置設置。當我做一個運行應用程序或將WAR部署到Tomcat中時,請執行以下操作:

boolean maintenanceMode = grailsApplication.config.site.maintenance.mode 

maintenanceMode將恢復爲真。如果我看在調試模式下配置對象,這就是我得到:

site={maintenance={mode=false, message="<p>Our trail guides are working hard to get the system back on track.</p><p>We're sorry, the account system is down for maintenance at the moment. We'll get it back online as quickly as we can. Thanks for your patience.</p>"}} 

我有使用動態重新加載這個配置文件,打這個控制器將解決這個問題的控制器。但我很好奇,爲什麼它在第一次運行時是不正確的,以及爲什麼在維護模式變量和實際在配置對象中的變量之間存在差異。

+0

「曼寧」來自哪裏,是site.maintenance.mode嵌套在配置下?我問,因爲根據從配置和調試輸出的片段中,這似乎是「grailsApplication.config.site.maintenance.mode」真的是你要分配給maintenanceMode什麼。 –

+0

對不起,錯字。編輯修復。 – Gregg

+0

只是爲了排除明顯...你已經在你的IDE爲「site.maintenance.mode」進行文本搜索到任何地方看到它被accesssed?驗證在Config.groovy中沒有兩個條目,Bootstrap中沒有遺留代碼或任何東西? – proflux

回答

5

您使用的是Java屬性文件或Groovy文件的一部分?如果您正在使用,然後屬性文件,我相信Grails將解釋site.maintenance.mode=false一樣site.maintenance.mode='false'和在Groovy中會解釋:

"false".asBoolean() == true 

那麼這將解釋爲什麼你會看到初始真正的價值。

我只是在本地運行一個簡單的測試來驗證此行爲。當我在外部化一個名爲我的財產test.properties然後site.maintenance.mode=false最初得到的true一個布爾值,當我使用了一個名爲test.groovy文件,那麼它解釋的site.maintenance.mode=false爲假的布爾值。我相信這是因爲當你使用Groovy文件Grails使用ConfigurationSlurper來處理它,但是當你使用一個屬性文件的Grails解釋一切作爲字符串名稱/值對。

+0

你明白了!我正在使用.properties文件。我將其更改爲.groovy,現在可以使用。也就是說,我仍然覺得奇怪,如果我把它留給一個.properties文件,我可以使用config.merge()傳遞一個新的ConfigSlurper來加載該文件,並且它可以正常工作。但我會拿我能得到的。 – Gregg

-1

我做的是有一個外部Config.groovy中的文件,例如:MyConfig.groovy

在標準的Grails的Config.groovy文件的末尾,我有以下幾點:

def ENV_NAME = "MY_EXTERNAL_CONFIG" 
if(!grails.config.locations || !(grails.config.locations instanceof List)) { 
    grails.config.locations = [] 
} 
if(System.getenv(ENV_NAME)) { 
    grails.config.locations << "file:" + System.getenv(ENV_NAME) 
} else if(System.getProperty(ENV_NAME)) { 
    grails.config.locations << "file:" + System.getProperty(ENV_NAME) 
} else { 
    println "No external Configs found." 
} 

所以,現在你可以有一個MyConfig.groovy文件在生產環境中(例如)在任何地方,然後設置一個環境系統變量指向此文件(或把它作爲參數的startup.sh),你啓動tomcat前:

MY_EXTERNAL_CONFIG="/home/tomcat/configs/MyConfig.groovy" 
export MY_EXTERNAL_CONFIG 

就是這樣。現在你有一個外部的MyConfig.groovy文件。它的特性是從你的Grails應用程序訪問,因爲他們是標準的Config.groovy

import org.codehaus.groovy.grails.commons.* 
//... 
ConfigurationHolder.config.foo.bar.hello 
+0

關於如何設置外部配置文件,您有一個很好的答案,但是這並沒有解決第一次配置值未正確加載的問題。 –