我目前正在更新我的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 }
}
}
}
有人会建议一种允许我在编解码器类中以静态方式访问配置对象的方法吗?
答案 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,这是访问配置对象的方式。