【问题标题】:Grails: can settings in Config.groovy be overridden programmatically at runtime?Grails:可以在运行时以编程方式覆盖 Config.groovy 中的设置吗?
【发布时间】:2013-10-02 01:31:58
【问题描述】:

邮件插件是documented,需要在 Config.groovy 中进行设置。我想将它存储在数据库中,以便可以在运行时进行更改。这只是一个例子。

我读过Does externalizing sensitive config variables into a .properties outside of Config.groovy provide a security advantage in Grails?,但这是关于使用外部属性文件,我需要将设置存储在数据库中(应用程序有一个管理界面,带有审计等)。

谢谢。

【问题讨论】:

标签: grails


【解决方案1】:

Bootstrap.groovy 中,您可以从数据库中读取属性值,并通过更新grailsApplication.config 替换从配置文件中读取的值。例如,假设您要替换名为 foo.bar 的配置属性的值

class BootStrap {

    GrailsApplication grailsApplication

    def init = { servletContext ->

        def fooBarDB = // read the value of foo.bar from the database
        grailsApplication.config.foo.bar = fooBarDB
    }
}

您可以改用Dynamic Config Plugin 来实现相同的结果,而不是自己编写此代码。

【讨论】:

  • 是否可以在 Bootstrap 之外进行?
【解决方案2】:

是的,您可以这样做。在使用Bootstrap.groovy 的grails 引导过程中,从数据库中检索属性并覆盖它们。它类似于属性文件覆盖,您只是将它们存储在数据库中。

另见Properties in the database

【讨论】:

  • 谢谢。你的答案和唐的一样,但他领先了几分钟。
  • 我真的不在乎谁接受,因为目标是提供 hlep,但我认为你应该重新检查时间......
  • 是否可以在 Bootstrap 之外进行?
【解决方案3】:

改变价值动态的第一种方法:

grailsApplication.config.grails.mail.put("port",your database fetch value of port)
grailsApplication.config.grails.mail.put("username","your database fetch value of username")
grailsApplication.config.grails.mail.put("password","your database fetch value of username")
grailsApplication.config.grails.mail.put("props","your database fetch value of username")

改变价值动态的第二种方式:

org.codehaus.groovy.grails.commons.DefaultGrailsApplication

DefaultGrailsApplication 类提供有关配置的所有信息。您可以使用以下代码获取电子邮件信息并将其动态更改。

def defaultGrailsApplication= new DefaultGrailsApplication()

// to get mails information from Config.groovy
defaultGrailsApplication?.config?.grails.mail?.get("host")
defaultGrailsApplication?.config?.grails.mail?.get("port")
defaultGrailsApplication?.config?.grails.mail?.get("username")
defaultGrailsApplication?.config?.grails.mail?.get("password")
defaultGrailsApplication?.config?.grails.mail?.get("props")


// to change mails information of Config.groovy
defaultGrailsApplication?.config?.grails.mail?.put("host","your database fetch value of host")
defaultGrailsApplication?.config?.grails.mail?.put("port",your database fetch value of port)
defaultGrailsApplication?.config?.grails.mail?.put("username","your database fetch value of username")
defaultGrailsApplication?.config?.grails.mail?.put("password","your database fetch value of username")
defaultGrailsApplication?.config?.grails.mail?.put("props","your database fetch value of username")

现在您需要分配这个 "defaultGrailsApplication" 实例来注入应用程序的值。假设我们有一个类服务 Temp.service 注入了 grailsApplication,如下所示:

Temp.service

class Temp{
  def grailsApplication

  def your method(){
         please add above code for set value
         grailsApplication = defaultGrailsApplication
  }

}

【讨论】:

  • 第一种方法对我不起作用......至少在引导程序之外......它对你有用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多