2011-08-08 8 views
6

ドメインオブジェクトまたは静的スコープからConfig.groovy情報を取得するにはどうすればよいですか?私はConfigurationHolder.config。*を使用していますが、これとApplicationHolderは廃止されましたので、私はそれを正しくしたいと思います...しかし、grailsApplicationオブジェクトはDO/staticスコープでは利用できません。grails 2.0.0M1の設定情報をドメインオブジェクトとスタティックスコープで取得していますか?

答えて

8

私はドメインクラスのメタクラスにgrailsApplicationを追加したいと思いますが、これは私が最終的に2.0について行っていることです。今のところ、BootStrap.groovyに入力してください。

class BootStrap { 

    def grailsApplication 

    def init = { servletContext -> 
     for (dc in grailsApplication.domainClasses) { 
     dc.clazz.metaClass.getGrailsApplication = { -> grailsApplication } 
     dc.clazz.metaClass.static.getGrailsApplication = { -> grailsApplication } 
     }  
    } 
} 

次に、あなたgrailsApplication.mainContext.getBean('foo')またはちょうどgrailsApplication.mainContext.fooを経由してgrailsApplication.configから設定にアクセスし、Spring Beanをすることができます。

+0

良いアイデア...しかし、起動時には、に起因する」で失敗します。ブートストラップが実行される前にHibernateが何かをしているように見えるので、test objectqdcore.UserCallFlowをインスタンス化できませんでした(qdcore.UserCallFlowはドメインクラスです)。これを回避するために、安全なderef(例えば、grailsApplication?.config?.qdcore?.servers?.upload?.url)を使用して、Hibernateがハッピーで、ブートストラップが実行され、grailsApplicationが利用できるようにします。ありがとう! – Wayne

+0

しかし、安全なderefをDOで行っても(def grailsApplication; def config = grailsApplication?.config; def String usrv = config?.qdcore?.servers?.upload?.url)私は自分自身をソートアウトするときに投稿します) – Wayne

+0

DOで動作するのは、grailsApplicationの静的スコープと残りのインスタンススコープです。たとえば、クラスUCF {static grailsApplication; def config = grailsApplication?.config; def String usrv = config?.qdcore?.servers?.upload?.url ...}私は他のものに静的スコープを使用することはできません。なぜなら、設定プロパティを取得しようとすると "grailsApplication"がnullであるという例外が発生するからです。おそらく、これはちょっとしたことですが、このプロトタイプアプリケーションではうまくいきます! – Wayne

1

静的ユーティリティでのみconfigにアクセスしたいと思っていました。 SOの答えのほとんどを検索して読んだ後、私は(誰かのために有用である可能性がある)シンプルなソリューションに付属している:

は、グルーヴィーなのsrc /下ホルダークラスを追加します。

class StaticContext { 
    static def app; 
} 

は、ブートストラップのinitで

それを初期化します
class BootStrap { 

    def grailsApplication 

    def init = { servletContext -> 
     StaticContext.app = grailsApplication 
    } 

    def destroy = { 
    } 
} 

と静的ユーティリティでアクセスして:

//In my case Solr URL in single ton 
def solrUrl = StaticContext.app.config.solr.url 
19

Grailsの2 repla同じコンテナ内の複数の異なるWebアプリケーションが親クラスローダー内のGrails JARの単一コピーを共有している場合に安全です(これは、古いホルダーが壊れた場合)。 Grailsの2.2.5で

import grails.util.Holders 

// ... 

static void foo() { 
    def configOption = Holders.config.myapp.option 
} 
+0

これは、石英のスケジュールされたジョブの静的トリガーブロックで特に役立ちました。ありがとう! – Gary

+0

これは、外部プロパティーファイルから構成可能なものを持つために、ドメイン内のhibernateマッピングでも働いています。ありがとう。 – Eduard

1

私は、これは動作しますが見つかりました:

  1. は、ご使用の環境のセクションappropiateで、grails-app/conf/Config.groovyであなたの変数を設定します。たとえば、次のようにアクセスするには

    environments { 
    ... 
        development { 
        ... 
        grails.config.myUrl = "http://localhost:3000" 
        ... 
    

    ...

  2. :org.hibernate.InstantiationException:

    import grails.util.Holders 
    
    class myClass { 
    ... 
    
        def static myStaticMethod() { 
         def myVar = Holders.config.grails.config.myUrl 
    ... 
    
関連する問題