Grails 2.0使用POGO中外部文件的配置值

时间:2012-01-19 22:26:23

标签: grails grails-config

以下是该方案。我的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那样:)

2 个答案:

答案 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中传递一次。