1

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

任何人都可以提出一种方法,允许我在编解码器类中以静态方式访问配置对象吗?

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

如果您的所有编解码器类只需要相同的一个配置属性,您可以完全跳过注入 grailsApplication 和/或配置对象,而只需从 BootStrap 设置一个静态属性。

于 2012-05-20T23:51:50.897 回答
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.util.Holders从 grails 2.0 开始引入,它是访问配置对象的方式。

于 2013-10-09T03:14:41.337 回答