2013-04-05 118 views
1

我正在嘗試將遺留的java/spring應用程序集成到我的grails應用程序中。這段代碼使用了很多自定義屬性,當我連接傳統應用上下文時,看起來不可用。Grails屬性初始化

如果我在Config.groovy中單獨加載它們,事情就會開始起作用,但我真的就像這樣做的一種程序化方式(意思是加載遺留屬性對象並將它們插入到grails配置中)。

這樣做的最好方法是什麼? Bootstrap init看起來太晚了,appContext已經在那個時候刷新了,並且它引發了一個關於未解析屬性的異常。

+0

您將此屬性存儲在自定義文件中,或者這是一個自定義類? – 2013-04-05 16:27:49

+0

這是一個自定義的類/數據格式。雖然有一個bean可以將屬性公開爲屬性對象。 – rongenre 2013-04-05 16:30:37

回答

5

在您Config.groovy你可以做一個基本的技巧像

Properties legacyProps = // whatever you need to do to load the legacy properties 
for(String propName in legacyProps.stringPropertyNames()) { 
    setProperty(propName, legacyProps.getProperty(propName)) 
} 

這將對於不包含任何點屬性名稱的工作。那些包括點屬性將被添加到Grails的配置,但僅作爲平鍵,不分層,即

grailsApplication.config.'property.with.dots' 

,而不是

grailsApplication.config.property.with.dots 

如果你希望他們在適當的層次關係,你可以添加做到這一點使用Groovy技巧提供你可以肯定,有沒有情況,你有一個關鍵是另一個的前綴的傳統特性,即

my.app.foo=bar 
my.app.bar=baz 

是確定的,但

my.app.foo=bar 
my.app=baz 

也不行。如果屬性滿足這個,然後嘗試像

Properties legacyProps = // whatever you need to do to load the legacy properties 
for(String propName in legacyProps.stringPropertyNames()) { 
    String[] propParts = propName.split(/\./) 
    if(propParts.size() == 1) { 
    // no dots 
    setProperty(propName, legacyProps.getProperty(propName)) 
    } else { 
    // we have dots - get the first segment (which is a ConfigObject) 
    ConfigObject co = getProperty(propParts[0]) 
    if(propParts.size() > 2) { 
     // then apply all but the last segment to that to get the last parent 
     co = propParts[1..-2].inject(co) { o, part -> o."${part}" } 
    } 
    // then set final segment on the last parent ConfigObject 
    co."${propParts[-1]}" = legacyProps.getProperty(propName) 
    } 
}