2014-05-02 74 views
4

變量在我Config.groovy我:重用的Grails內的Config.groovy

// Lots of other stuff up here... 

environments { 
    development { 
     myapp.port = 7500 
    } 
    production { 
     myapp.port = 7600 
    } 
} 

fizz { 
    buzz { 
     foo = "Port #${myapp.port}" 
    } 
} 

當我通過grails -Dgrails.env=development run-app運行我的應用程序,我的web應用旋轉起來沒有錯誤,但隨後在運行時我看到的fizz.buzz.foo值是「Port#[:]」。 我期望它是「Port#7500」。

爲什麼Grails看不到我的var?

+0

[如何從Config.groovy中的其他配置變量引用一個配置變量](http://stackoverflow.com/questions/18528595/how-to-refer-to-one-configuration-variable- from-other-configuration-variable-ins) –

+0

另一個[可能重複的問題](http://stackoverflow.com/a/20754029/2051952)。 – dmahapatro

+0

@dmahapatro這是一個稍微不同的情況,因爲他們試圖從'log4j'閉包中訪問配置值,該閉包比晚些時候配置的其餘部分被評估。 –

回答

1

另一種方法是簡單地你的配置文件中使用的變量是這樣的:

def appPort = 7500 

environments { 
    production { 
     appPort = 7600 
     myapp.port = appPort 
    } 
} 

fizz { 
    buzz { 
     foo = "Port #$appPort" 
    } 
} 

而且也,你並不需要發送-Dgrails.environment =發展當你執行運行 -應用程序,這是默認的。

+2

這將適用於在'Config.groovy'中直接指定的值,但它不會允許您在'grails.config.locations'外部配置文件中覆蓋'myapp.port'(或者,您可以覆蓋'myapp。端口',但'fizz.buzz.foo'仍然會從'Config'中取值。groovy'而不是被覆蓋的)。 –

3

你也許可以逃脫這個如果myapp.port不是在environments塊但那方式Config.groovy的副作用被處理,而不是故意的。如果您要在外部配置文件中覆蓋myapp.port,則fizz.buzz.foo仍然會以Config.groovy的值結束,而不是外部覆蓋。

你可以把它後期綁定的GString使用封蓋從grails.util.Holders.config拉值時fizz.buzz.foo引用而不是當它是定義

foo = "Port #${-> Holders.config.myapp.port}" 

這是"Port #${Holders.config.myapp.port}"不同,其會嘗試在正在解析Config.groovy的位置訪問配置。

如果您在這裏定義的值最終會定義Spring bean的屬性(例如,許多spring-security-core插件配置選項成爲bean屬性),那麼您可能能夠做

foo = 'Port #${myapp.port}' 

而不是雙引號。這會導致生成的配置條目包含文字字符串${myapp.port},當它被用作bean屬性值時,將由Spring屬性佔位符機制根據配置進行解析。

相關問題