Grails属性初始化

ron*_*nre 1 grails spring

我正在尝试将遗留的java/spring应用程序集成到我的grails应用程序中.此代码使用了许多自定义属性,这些属性在我连接遗留应用程序上下文内容时似乎不可用.

如果我在Config.groovy中单独加载它们,事情就会开始起作用,但我真的很喜欢这样做的一种编程方式(意味着加载遗留属性对象并将它们插入grails配置中).

这样做的最佳方法是什么?Bootstrap init似乎为时已晚,appContext已经在那时刷新了,它引发了一个关于未解析属性的异常.

Ian*_*rts 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))
}
Run Code Online (Sandbox Code Playgroud)

这适用于不包含任何点的属性名称.包含点的属性将添加到Grails配置中,但仅作为平键,而不是分层,即

grailsApplication.config.'property.with.dots'
Run Code Online (Sandbox Code Playgroud)

而不是

grailsApplication.config.property.with.dots
Run Code Online (Sandbox Code Playgroud)

如果你想让它们以适当的层次结构形式添加你可以用Groovy技巧做到这一点,只要你可以确定遗留属性中没有你有一个键是另一个的前缀的情况,即

my.app.foo=bar
my.app.bar=baz
Run Code Online (Sandbox Code Playgroud)

没关系,但是

my.app.foo=bar
my.app=baz
Run Code Online (Sandbox Code Playgroud)

不行.如果属性满足这个,那么尝试类似的东西

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)
  }
}
Run Code Online (Sandbox Code Playgroud)