2012-01-19 38 views
1

以下是方案。我的Grails应用程序之外有一个包含url/username/password/etc的文件。信息,以便开发人员无法查看生产的连接信息。我包括在实践中Config.groovy中这样的信息:Grails 2.0使用POGO中外部文件的配置值

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中,而grails应用程序的Grails自动装配没有被调用。我的问题有2个部分:

1)在POGO中有没有更好的方式从文件中获取配置信息?

2)如果没有更好的方法,我该如何将grailsApplication注入到POGO中?

其他信息: 我正在使用Grails GLDAPO插件(http://gldapo.codehaus.org/)与LDAP目录进行接口。我试图让这些对象(我放在/ src/groovy下)的行为与域对象相同,因为我可以使用静态方法来做findBy...(..)。有了你建议的模式,我必须通过服务来获取数据。这并不坏,它只是不如Groovy :)

回答

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,讨论重载构造函数。

+0

感谢@BurtBeckwith的输入! –

0

您必须从一个可以依赖注入grailsApplication bean的工件调用它,至少是间接的。将def grailsApplication添加到服务或Quartz作业或任何正在调用您的POGO并将grailsApplication.config传递给需要它的方法调用或者一次调用setter。

+0

感谢您的回复,我添加了一些额外的信息。你可以看一看,看看有没有办法避免通过服务实现数据访问?感谢您的反馈btw! –