Grails外部配置在第一次加载时读取不正确

Gre*_*egg 3 configuration grails

Grails 1.3.7

我有一些配置位于外部配置文件中.其中一个entires看起来像这样:

site.maintenance.mode = false
Run Code Online (Sandbox Code Playgroud)

我有一个过滤器,它检查特定URL的某些配置设置.当我执行run-app或将WAR部署到Tomcat时,执行以下操作:

boolean maintenanceMode = grailsApplication.config.site.maintenance.mode
Run Code Online (Sandbox Code Playgroud)

maintenanceMode正在回归真实.如果我在调试模式下查看配置对象,这就是我得到的:

site={maintenance={mode=false, message="<p>Our trail guides are working hard to get the system back on track.</p><p>We're sorry, the account system is down for maintenance at the moment.  We'll get it back online as quickly as we can.  Thanks for your patience.</p>"}}
Run Code Online (Sandbox Code Playgroud)

我有一个控制器,我用它来动态重新加载此配置文件,点击此控制器将解决问题.但我很好奇为什么它在第一次运行时是不正确的,以及为什么在维护模式变量中放入的内容与配置对象中的实际内容之间存在差异.

pro*_*lux 5

您使用的是Java属性文件还是Groovy文件?如果您正在使用属性文件,那么我相信Grails会以与Groovy解释site.maintenance.mode=false相同的方式site.maintenance.mode='false'解释:

"false".asBoolean() == true
Run Code Online (Sandbox Code Playgroud)

那么这就解释了为什么你会看到最初的真实价值.

我刚刚在本地运行了一个简单的测试来验证这种行为.当我在外部化一个名为我的财产test.properties,然后site.maintenance.mode=false开始得到的一个布尔值true,当我使用一个名为test.groovy那么它解释的布尔值site.maintenance.mode=false是假的.我相信这是因为当您使用Groovy文件时,Grails使用ConfigurationSlurper来处理它,但是当您使用属性文件时,Grails会将所有内容解释为String名称/值对.