我正在尝试将旧版 java/spring 应用程序集成到我的 grails 应用程序中。此代码使用了许多自定义属性,当我连接旧版应用程序上下文内容时,这些属性似乎不可用。
如果我在 Config.groovy 中单独加载它们,事情就会开始工作,但我真的很喜欢一种编程方式(意味着加载遗留属性对象并将它们插入到 grails 配置中)。
这样做的最佳方法是什么?Bootstrap init 似乎为时已晚,此时 appContext 已经刷新,并且引发了有关未解析属性的异常。
在您的内部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)
}
}