这是一个场景。我在Grails应用程序之外有一个文件,其中包含url/username/password/等。信息,使开发人员无法看到用于生产的连接信息。我通过以下操作将这些信息包括在Config.groovy中:
grails.config.locations << "file:" + "C:/directory/from/env/variable/data.properties"
然后我在POGO中通过访问这些信息
import org.codehaus.groovy.grails.commons.ConfigurationHolder
...
ConfigurationHolder.config.url
ConfigurationHolder.config.userName
ConfigurationHolder.config.password
在升级到Grails 2.0之后,我注意到ConfigurationHolder已被弃用。所以我查阅了文档:(http://grails.org/doc/latest/guide/conf.html)试图找出如何修复它。文档中说使用grailsApplication来获取配置值。我的问题是,我在POGO中,grailsApplication的Grails自动布线没有被调用。我的问题有两部分:
1) 有没有更好的方法可以在POGO内部从文件中获取配置信息?
2) 如果没有更好的方法,我该如何将grailsApplication注入POGO?
附加信息:我正在使用Grails GLDAPO插件(http://gldapo.codehaus.org/)以与LDAP目录对接。我试图使这些对象(我已经将其放置在/src/groovy下)以与域对象相同的方式工作,因为我可以在它们上使用静态方法来执行findBy...(..)
。按照你建议的模式,我必须通过一个服务来获取数据。这还不错,只是不像Groovy:)
基于更新问题的新答案。
你有几个选择。一种是在grailsApplication
中连接到这些类的元类,即在BootStrap.groovy
:中
class BootStrap {
def grailsApplication
def init = { servletContext ->
YourClass.metaClass.getGrailsApplication = { -> grailsApplication }
}
}
这将添加一个可以作为grailsApplication
属性访问的getGrailsApplication
方法。
另一个选项是向这些类添加一个静态grailsApplication
字段,并在BootStrap
:中进行设置
class BootStrap {
def grailsApplication
def init = { servletContext ->
YourClass.grailsApplication = grailsApplication
}
}
另请参阅这篇讨论创建holder类的博客文章和这篇讨论重写构造函数的博客文章。
您必须从一个可以依赖注入grailsApplication
bean的工件中调用它,至少是间接的。将def grailsApplication
添加到服务或Quartz作业或调用POGO的任何作业中,并将grailsApplication.config传递给需要它的方法调用,或者在setter中传递一次。