2016-08-19 5 views
3

Я часто использую стандартные файлы свойств Java для настройки моих приложений Groovy. Одна из особенностей, которую я упустил, - это возможность использовать переменные как часть значения свойства, чтобы они могли динамически расширяться во время использования. Я думал, что могу предоставить эту функциональность, используя следующую схему:Использование Groovy для расширения переменных в свойствах Java

  1. Используйте специальный формат для аннотирования свойств, которые следует развернуть. Я решил включить такие шаблоны в двойные восклицательные знаки (!!). Эти значения свойств по существу являются шаблонами, которые должны быть расширены с помощью локальных переменных
  2. Перед использованием свойств в приложении используйте метод groovy 'evaluation' для расширения переменных приложения в шаблоне
  3. Повторно присвойте исходный ключ свойства новое значение перед использованием

Так что, если у меня есть файл свойств config.properties со свойствами, как:

version=2.3 
local_lib=!!${env['GROOVY_HOME']}/${configProps.getProperty('version')}/lib!! 

local_lib свойство будет расширено от переменной GROOVY_HOME и версии значение свойства.

В моем приложении, я закодированы это следующим образом:

//Load the environment variables and configuration file 
env=System.getenv() 
configFile=new File('config.properties') 
configProps= new Properties() 
configProps.load(configFile.newDataInputStream()) 

//Replace configuration property values with their expanded equivalent 
configProps.each{ 
    //if a property value is a template we evaluate it 
    if (it.value.startsWith('!!')){ 
    valTemplate=it.value.replace('!!','"') 
    it.value=evaluate(valTemplate) 
    } 
} 

//then we use the expanded property values 

Это похоже на работу. Когда я

println configProps 

Я вижу, что значение расширяется и не нулевой

Однако метод GetProperty для расширенного свойства возвращает нуль.

assert configProps.getProperty('local_lib')=='C:\\DEVTOOLS\\groovy-2.4.7/2.3/lib' 
    |   |      | 
    |   null     false 
    [local_lib:C:\DEVTOOLS\groovy-2.4.7/2.3/lib, version:2.3] 

В чем причина этого несоответствия? Я бы ожидал вернуть значение, показанное на карте свойств.

ответ

5

Ваше значение local_lib выглядит как String, но это не так. Это GString, только при ленивом принуждении к String (например, при печати значения карты configProps).

Таким образом, здесь действует незначительный эффект Properties.getProperty(). Когда фактическое значение карты не является строкой, Properties.getProperty() возвращает null.

Для того, чтобы получить желаемое поведение, необходимо сохранить значение GString до String, прежде чем сохранять это значение на карте свойств. Как так:

it.value=evaluate(valTemplate).toString() 

или

it.value=evaluate(valTemplate) as String 

Затем вы должны увидеть желаемые результаты вниз по течению.

+0

Кстати, я избегаю использования Properties.getProperty() и Properties.setProperty() в Groovy именно по этой причине.Я предпочитаю использовать синтаксис и семантику карты при работе с объектами свойств. – BalRog

+0

О, действительно, @BalRog, принуждающий к String, решает проблему. Спасибо! –