1

非推奨の ConfigurationHolder クラスを使用しないように、現在 Grails プロジェクトを更新しています。ほとんどの場合、これでうまくいきますが、カスタム コーデック クラスで問題に直面しています。ここでは、これまで次のアプローチを使用してきました。

import org.codehaus.groovy.grails.commons.ConfigurationHolder as CH
class MyCodec {

    static boolean myStaticConfigProperty=CH.config.myStaticConfigProperty

    static encode = { something ->
       if(myStaticConfigProperty)
          ...
    }

}

を使用した直接注入

def grailsApplication 

これは非静的オブジェクトとして注入されるため、この場合は機能しません。

代わりに、この記事の Getting-grails-2-0-0m1-config-info-in-domain-object-and-static-scopeで提案されているアプローチを使用しようとしましたが、grailsApplication オブジェクトを注入した後でも機能させることはできませんブートストラップの私のコーデック メタクラスに:

class BootStrap {

   def grailsApplication

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

コーデッククラス内で静的な方法で構成オブジェクトにアクセスできるようにするアプローチを誰かが提案できますか?

4

2 に答える 2

2

この完全にテストされていないコードのようなものをお勧めします。

class MyCodec {

    static def grailsConfig

    static boolean myStaticConfigProperty = grailsConfig.myStaticConfigProperty

    static encode = { something ->
       if(myStaticConfigProperty)
          ...
    }

}

class BootStrap {

   def grailsApplication

   def init = { servletContext ->
      for (cc in grailsApplication.codecClasses) {
         cc.grailsConfig = grailsApplication.config 
      }      
   }
}

すべてのコーデック クラスが同じ 1 つの構成プロパティだけを必要とする場合は、grailsApplication や構成オブジェクトを完全に注入するのをスキップして、BootStrap から 1 つの静的プロパティを設定するだけで済みます。

于 2012-05-20T23:51:50.897 に答える