Grails — доступ к статическому объекту конфигурации в классе кодека

В настоящее время я обновляю свой проект Grails, чтобы не использовать устаревший класс ConfigurationHolder. В большинстве случаев это работает нормально, но я сталкиваюсь с проблемами в своих пользовательских классах кодеков, где до сих пор я использовал следующий подход:

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 }
      }      
   }
}

Может ли кто-нибудь предложить подход, который позволит мне получить доступ к объекту конфигурации статическим способом внутри классов кодеков?


person John Doppelmann    schedule 20.05.2012    source источник


Ответы (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 
      }      
   }
}

Если всем вашим классам кодеков требуется одно и то же свойство конфигурации, вы можете вообще не внедрять приложение grailsApplication и/или объект конфигурации и просто установить одно статическое свойство из BootStrap.

person GreyBeardedGeek    schedule 20.05.2012
comment
Я попробовал ваш подход, но он, похоже, не работает. Я считаю, что причина в том, что объект MyCodec инициализируется до запуска Bootstrap.init(). Таким образом, строка static boolean myStaticConfigProperty = grailsConfig.myStaticConfigProperty кажется причиной сбоя. - person John Doppelmann; 21.05.2012
comment
Итак, вам, вероятно, придется сделать свойство нестатическим. Вот пример, который выглядит так, как будто он делает то, что вы хотите. zorched.net/2008/02 /03/ - person GreyBeardedGeek; 23.05.2012
comment
Немного опоздал с продолжением. Я попробовал предложенный вами подход, но не смог заставить его работать. В итоге вместо этого использовал этот подход. Это работает:burtbeckwith.com/blog/?p=993 - person John Doppelmann; 02.07.2012

это работает для меня в Grails 2.2.3

import grails.util.Holders as holders;

class MyFileCodec {
    static encode = {file ->
        def configPath= holders.grailsApplication.config.share.contextPath
        return "${configPath}/${file.name}"
    }
}

grails.util.Holders появился, начиная с версии grails 2.0. , это способ доступа к объекту конфигурации.

person ressol    schedule 09.10.2013