以下是该方案。我的Grails应用程序之外的文件包含url / username / password / etc.信息使开发人员无法查看生产的连接信息。我通过以下方式将此信息包含在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那样:)
答案 0 :(得分:5)
基于更新问题的新答案。
您有几个选择。一种是将grailsApplication
连接到这些类的元类,即在BootStrap.groovy
中:
class BootStrap {
def grailsApplication
def init = { servletContext ->
YourClass.metaClass.getGrailsApplication = { -> grailsApplication }
}
}
这会添加一个getGrailsApplication
方法,可以作为grailsApplication
属性进行访问。
另一种选择是向这些类添加静态grailsApplication
字段,并在BootStrap
中设置:
class BootStrap {
def grailsApplication
def init = { servletContext ->
YourClass.grailsApplication = grailsApplication
}
}
另请参阅讨论创建持有者类的this blog post和讨论覆盖构造函数的this one。
答案 1 :(得分:0)
您必须从可以依赖注入grailsApplication
bean的工件中调用它,至少是间接地。将def grailsApplication
添加到服务或Quartz作业或调用您的POGO的任何内容,并将grailsApplication.config传递给它,以用于需要它的方法调用,或者在setter中传递一次。