在Config.groovy中重用Grails变量

时间:2014-05-02 12:17:06

标签: grails groovy configuration

Config.groovy我有:

// Lots of other stuff up here...

environments {
    development {
        myapp.port = 7500
    }
    production {
        myapp.port = 7600
    }
}

fizz {
    buzz {
        foo = "Port #${myapp.port}"
    }
}

当我通过grails -Dgrails.env=development run-app运行我的应用时,我的网络应用会旋转而没有错误,但在运行时我看到fizz.buzz.foo的值是" 端口#[: ] &#34 ;. 我希望它是"#7500"

为什么Grails没有看到我的var?

2 个答案:

答案 0 :(得分:3)

如果myapp.port不在environments区块中,您可能会侥幸成功,但这会影响Config.groovy的处理方式,而不是故意的。如果您要在外部配置文件中覆盖myapp.port,那么fizz.buzz.foo仍会以Config.groovy的值结束,而不是来自外部的覆盖。

你可以使用一个闭包来使它成为一个后期绑定的GString,当grails.util.Holders.config 引用而不是定义<时,从fizz.buzz.foo提取值/ EM>:

foo = "Port #${-> Holders.config.myapp.port}"

这与"Port #${Holders.config.myapp.port}"不同,Config.groovy会尝试在解析foo = 'Port #${myapp.port}' 的位置访问配置。

如果你在这里定义的值最终将最终定义一个Spring bean的属性(例如许多spring-security-core插件配置选项成为bean属性)那么你可能能够做

${myapp.port}

使用而不是双引号。这会导致生成的配置条目包含文字字符串{{1}},当它用作bean属性值时,将通过Spring属性占位符机制对配置进行解析。

答案 1 :(得分:1)

另一种方法是在配置文件中简单地使用变量,如下所示:

def appPort = 7500

environments {
    production {
        appPort = 7600
        myapp.port = appPort
    }
}

fizz {
    buzz {
        foo = "Port #$appPort"
    }
}

而且,当您执行run-app时,您不需要发送 -Dgrails.environment = development ,它是默认的。