Внешняя конфигурация Grails прочитана неправильно при первой загрузке - PullRequest
3 голосов
/ 24 августа 2011

Grails 1.3.7

У меня есть некоторая конфигурация, расположенная во внешнем файле конфигурации.Один из вариантов выглядит следующим образом:

site.maintenance.mode = false

У меня есть фильтр, который проверяет определенные параметры конфигурации для определенных URL-адресов.Когда я запускаю приложение запускаю или развертываю WAR-файл в Tomcat и выполняю:

boolean maintenanceMode = grailsApplication.config.site.maintenance.mode

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

У меня есть контроллер, который я использую для динамической перезагрузки этого файла конфигурации, и нажатие на этот контроллер решит проблему.Но мне любопытно, почему это некорректно при первых запусках и почему несоответствие в том, что помещается в переменную maintenanceMode, в сравнении с тем, что на самом деле находится в объекте config.

Ответы [ 2 ]

5 голосов
/ 03 сентября 2011

Вы используете файл свойств Java или файл Groovy?Если вы используете файл свойств, то я полагаю, что Grails будет интерпретировать site.maintenance.mode=false так же, как site.maintenance.mode='false', и, поскольку Groovy будет интерпретировать:

"false".asBoolean() == true

, тогда это объясняет, почему вы видите это начальное значение trueзначение.

Я просто провел локальный тест для проверки этого поведения.Когда я экстернализую свои свойства в файле с именем test.properties, тогда site.maintenance.mode=false первоначально получает логическое значение true, когда я использую файл с именем test.groovy, тогда он интерпретирует логическое значение site.maintenance.mode=false как ложное.Я полагаю, это потому, что когда вы используете Groovy-файл, Grails использует ConfigurationSlurper для его обработки, но когда вы используете файл свойств, Grails интерпретирует все как строки имя / значение String.

0 голосов
/ 02 сентября 2011

Что мне делать, так это иметь внешний файл Config.groovy, например: MyConfig.groovy

В конце стандартного файла grails Config.groovy у меня есть следующее:

def ENV_NAME = "MY_EXTERNAL_CONFIG"
if(!grails.config.locations || !(grails.config.locations instanceof List)) {
    grails.config.locations = []
}
if(System.getenv(ENV_NAME)) {
    grails.config.locations << "file:" + System.getenv(ENV_NAME)
} else if(System.getProperty(ENV_NAME)) {
    grails.config.locations << "file:" + System.getProperty(ENV_NAME)
} else {
    println "No external Configs found."
}

Так что теперь вы можете иметь файл MyConfig.groovy в любом месте производственной среды (например), а затем установить системную переменную среды, чтобы она указывала на этот файл (или передать его в качестве параметра для startup.sh), перед тем как запустить tomcat:

MY_EXTERNAL_CONFIG="/home/tomcat/configs/MyConfig.groovy"
export MY_EXTERNAL_CONFIG

Вот и все. Теперь у вас есть внешний файл MyConfig.groovy. Свойства в нем доступны из вашего приложения Grails, так как они были частью стандартного Config.groovy

import org.codehaus.groovy.grails.commons.*
//... 
ConfigurationHolder.config.foo.bar.hello
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...