1

レガシー Java/Spring アプリを Grails アプリに統合しようとしています。このコードは、レガシーアプリのコンテキストを配線したときに利用できないように見える多くのカスタムプロパティを使用しています.

それらを Config.groovy に個別にロードすると、動作が開始されますが、プログラムによる方法が本当に必要です (レガシー プロパティ オブジェクトをロードして、それらを grails 構成に挿入することを意味します)。

これを行う最善の方法は何ですか?ブートストラップの初期化が遅すぎるようです。appContext はその時点で既に更新されており、未解決のプロパティに関する例外がスローされています。

4

1 に答える 1

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 のトリックを使用してそれを行うことができます.1 つのキーが別のプレフィックスである従来のプロパティにケースがないことを確認できます。つまり、

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

大丈夫ですが、

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

OKではありません。プロパティがこれを満たしている場合は、次のようなものを試してください

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)
  }
}
于 2013-04-05T16:53:31.853 に答える