2012-10-31 2 views
6

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

私はこのスレッドが見つかりました:

Converting Java -> Grails ... How do I load these properties?

使用することを提案している:のようなものが続く

private Map config = ConfigurationHolder.getFlatConfig(); 

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

これは実際には正常に動作します(TEHプロパティがロードされていますConfig.groovyから正しく)、問題はtですhat ConfigurationHolderは廃止された後です。そして、私は問題を扱う発見したいずれかのスレッドがGrailsの-特異的であり、このスレッドのように、依存性の注入を使用することをお勧めしているようだ:

How to access Grails configuration in Grails 2.0?

のでへのアクセスを得るために非推奨されない方法がありますJavaクラスファイルのConfig.groovyプロパティ

+0

リンク先の質問の[受け入れられた回答](http://stackoverflow.com/a/7136095/6509)の2番目の方法で何が問題になっていますか? –

+0

こんにちはTim、返信のための歓声。私は、リソースファイル(grailsApplicationのプロパティとgrailsApplicationのrefを持つ)をBeanとしてJavaクラスに入れ、クラスに次の行を追加しました:private GrailsApplication grailsApplication;ゲッターとセッターで。しかし、ConfigObject経由でアクセスしようとするとconfig = grailsApplication.getConfig();それはnullとエラーが出ているようです。私が間違っていることは何ですか?ありがとう – Illu

+0

どこにアクセスしようとしていますか?たとえば、 '@ PostConstruct'で注釈を付けられたメソッドを宣言し、その代わりに' grailsApplication'を必要とするロジックを置くか、代わりにコンストラクタ引数の注入を使う必要があります。セッター注入。 –

答えて

1

私はこれがうまくいかない理由を考え出すことができませんが、私は別のアプローチを完全に提案することができます。あなたはクラスの

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

を宣言して、あなたは豆を使用している場合、これはまたresources.groovyで働く

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

を言うことができるので、Grailsは、grailsApplication.configからその値をとるPropertyPlaceholderConfigurerを設定しますDSL、しかし、あなたは二重のではなく、単一引用符を使用することを覚えておく必要があります。

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

"${jdbc.driver}"を使用すると、GroovyがGStringとして解釈され、resources.groovyが処理されたときに解決されないため、リテラル${...}の式を後でプレースホルダによって解決されるプロパティ値として入れます。設定者。

3

ちょうど私の既存のコードの一部でチェックし、私はthis method described by Burt Beckwith

新しいファイルを作成して使用します、そして、

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

:含めるgrails-app/config/spring/resources.groovyを編集し、その後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() 
    } 
} 

src/javaまたはsrc/groovyのファイルには、

GrailsApplication app = ApplicationContextHolder.getGrailsApplication() ; 
ConfigObject config = app.getConfig() ; 
4

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

+0

これはBurtの[ApplicationContextHolder](http://burtbeckwith.com/blog/?p=1017)に代わるもので、その解決策の大半を提供し、静的割り当て問題にも対処しているためです。 – raffian

関連する問題