在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?
答案 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 ,它是默认的。