1

这是场景。我在 Grails 应用程序之外有一个文件,其中包含 url/用户名/密码/等。信息使开发人员无法看到生产的连接信息。我通过执行以下操作将这些信息包含在 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 :)

4

2 回答 2

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
   }
}

另请参阅讨论创建持有者类的博文和讨论重写构造函数的博文。

于 2012-01-20T15:40:49.477 回答
0

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

于 2012-01-20T01:18:52.523 回答