6

Grails アプリが起動すると、バックグラウンドで Spring Integration と Batch プロセスも開始します。いくつかの DB 接続プロパティを Config.groovy ファイルに保存したいのですが、統合/バッチ プロセスで使用される Java クラスからそれらにアクセスするにはどうすればよいですか?

このスレッドを見つけました:

Converting Java -> Grails ... これらのプロパティをロードするにはどうすればよいですか?

以下を使用することをお勧めします:

private Map config = ConfigurationHolder.getFlatConfig();

次のようなものが続きます:

String driver = (String) config.get("jdbc.driver");

これは実際には正常に機能します (プロパティは Config.groovy から正しく読み込まれます) が、問題は ConfigurationHolder が廃止された後であることです。そして、この問題を扱っていることがわかったスレッドはすべて Grails 固有のようであり、このスレッドのように依存性注入の使用を提案しています。

Grails 2.0 で Grails 構成にアクセスするには?

では、Java クラス ファイルから Config.groovy プロパティにアクセスする非推奨の方法はありますか?

4

3 に答える 3

4

既存のコードの一部をチェックインしたところ、Burt Beckwith が説明したこの方法を使用しています

新しいファイルを作成します。 src/groovy/ctx/ApplicationContextHolder.groovy

package ctx

import org.springframework.context.ApplicationContext
import org.springframework.context.ApplicationContextAware
import javax.servlet.ServletContext

import org.codehaus.groovy.grails.commons.GrailsApplication
import org.codehaus.groovy.grails.plugins.GrailsPluginManager
import org.springframework.context.ApplicationContext
import org.springframework.context.ApplicationContextAware

@Singleton
class ApplicationContextHolder implements ApplicationContextAware {
  private ApplicationContext ctx

  private static final Map<String, Object> TEST_BEANS = [:]

  void setApplicationContext(ApplicationContext applicationContext) {
    ctx = applicationContext
  }

  static ApplicationContext getApplicationContext() {
    getInstance().ctx
  }

  static Object getBean(String name) {
    TEST_BEANS[name] ?: getApplicationContext().getBean(name)
  }

  static GrailsApplication getGrailsApplication() {
    getBean('grailsApplication')
  }

  static ConfigObject getConfig() {
    getGrailsApplication().config
  }

  static ServletContext getServletContext() {
    getBean('servletContext')
  }

  static GrailsPluginManager getPluginManager() {
    getBean('pluginManager')
  }

  // For testing
  static void registerTestBean(String name, bean) {
    TEST_BEANS[name] = bean
  }

  // For testing
  static void unregisterTestBeans() {
     TEST_BEANS.clear()
  }
}

次に、以下を含めるように編集grails-app/config/spring/resources.groovyします。

  applicationContextHolder(ctx.ApplicationContextHolder) { bean ->
    bean.factoryMethod = 'getInstance'
  }

src/java次に、または内のファイルでsrc/groovy、次を呼び出すことができます。

GrailsApplication app = ApplicationContextHolder.getGrailsApplication() ;
ConfigObject config = app.getConfig() ;
于 2012-11-01T09:56:24.580 に答える
4

登録するだけで、Grails 2.x には、この非推奨のホルダーを置き換えるホルダー クラスがあります。grailsApplicationこれを使用して、静的コンテキストでアクセスできます。

于 2013-05-17T02:05:27.513 に答える
1

これが機能しない理由を理解することはできませんが、別のアプローチを完全に提案することはできます。PropertyPlaceholderConfigurerGrailsは、からその値を取得するを設定するため、次のgrailsApplication.configように宣言できます。

public void setDriver(String driver) { ... }

あなたのクラスでそして言う

<bean class="com.example.MyClass" id="exampleBean">
  <property name="driver" value="${jdbc.driver}" />
</bean>

これはresources.groovy、Beans DSLを使用している場合にも機能しますが、二重引用符ではなく一重引用符を使用することを忘れないでください。

exampleBean(MyClass) {
  driver = '${jdbc.driver}'
}

使用"${jdbc.driver}"は機能しません。これは、GroovyによってGStringとして解釈され、resources.groovy処理時に解決されるためです。一方、必要なのは${...}、プレースホルダーコンフィギュレーターによって後で解決されるプロパティ値としてリテラル式を挿入することです。

于 2012-10-31T16:52:06.047 に答える