Grails - 访问编解码器类中的静态配置对象

时间:2012-05-20 11:08:50

标签: grails grails-2.0

我目前正在更新我的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 }
      }      
   }
}

有人会建议一种允许我在编解码器类中以静态方式访问配置对象的方法吗?

2 个答案:

答案 0 :(得分: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设置一个静态属性。

答案 1 :(得分:1)

它适用于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 2.0以来已经引入了

grails.util.Holders,这是访问配置对象的方式。