Как разделить значение свойства в application.properties

Я хочу разделить значение свойства, определенного application.properties, и использовать его как значение для другого свойства.

Ниже приведены мои свойства в файле application.properties.

test.product.release.version=2003.1
test.product.release.year=${test.product.release.version}.split('.')[0]

Я хочу значение для свойства test.product.release.year как 2003

Я пробовал разделить с помощью ${test.product.release.version}.split('.')[0], но когда я получаю свойство в своем контроллере, я все равно получаю значение как 2003.1.split('.')[0]

Как я могу получить его только как 2003?


person Sameer    schedule 30.07.2019    source источник
comment
почему бы вам не загрузить его как массив?   -  person Deadpool    schedule 30.07.2019
comment
@Deadpool Я не хочу этого, потому что хочу снова использовать свойство test.product.release.year в качестве значения для другого свойства.   -  person Sameer    schedule 30.07.2019
comment
попробуйте мой ответ, я проверил его и работает   -  person Deadpool    schedule 30.07.2019


Ответы (4)


Вы можете получить год в контроллере напрямую

@Value("#{'${test.product.release.version}'.split('[.]')[0]}")
private String year;

Так же и для версии

@Value("#{'${test.product.release.version}'.split('[.]')[1]}")
private String version;

Точно так же вы можете указать это выражение в файле свойств.

test.product.release.version=2003.1
test.product.release.year="#{'${test.product.release.version}'.split('[.]')[0]}"
test.product.release.version="#{'${test.product.release.version}'.split('[.]')[1]}"

А затем используйте @Value, чтобы прочитать test.product.release.year

@Value("${test.product.release.year}")
private String value;
person Deadpool    schedule 30.07.2019
comment
test.product.release.version="#{'${test.product.release.version}'.split('[.]')[1]}" по-прежнему дает мне ценность, поскольку "#{'V2003.1'.split('[.]')[0]}" я получаю его через AbstractEnvironment #getProperty - person Sameer; 30.07.2019
comment
почему бы тебе не использовать @Value ? - person Deadpool; 30.07.2019
comment
потому что вы упомянули в ответе Точно так же вы можете указать это выражение и в файле свойств - person Sameer; 30.07.2019
comment
проверьте мой обновленный ответ, он работает для меня как в файле yml, так и в файле properties @Sameer - person Deadpool; 30.07.2019
comment
а также я тестировал, используя env.getProperty("test.product.release.year", это дает мне "#{'2003.1'.split('[.]')[0]}", поэтому просто используйте @Value вместо env - person Deadpool; 30.07.2019
comment
А также вы можете задать другой вопрос, почему он возвращает выражение вместо значения при использовании Env извините, у меня нет этой информации @Sameer - person Deadpool; 30.07.2019

С моей точки зрения, вы должны рассмотреть другую точку зрения:

test.product.release.version.year=2003
test.product.release.version.sub=1
test.product.release.version=${test.product.release.version.year}.${test.product.release.version.sub}
person jpmottin    schedule 30.07.2019
comment
Я не могу использовать два свойства, потому что значение свойства test.product.release.version.year не контролируется установщиком, который я не хочу трогать. - person Sameer; 30.07.2019

Используйте следующее выражение. Это сработает.

@Value("#{\"${test.product.release.version}\".split(\"\\.\")}")
private String[] myValues;

// this will give you year part.
@Value("#{\"${test.product.release.version}\".split(\"\\.\")[0]}")
private String year;
person YoManTaMero    schedule 30.07.2019

Поскольку вы собираетесь иметь одно свойство и получить другое из первого, было бы лучше сделать это, как показано ниже:

application.properties

test.product.release.version=2003.1

Класс конфигурации

@Value("${test.product.release.version}")
private String version;
@Value("#{'${test.product.release.version}'.split('\\.')[0]}")
private String year;
person Madhu Bhat    schedule 30.07.2019
comment
Если версия не настроена, {'${test.product.release.version}'.split('\\.')[0]} сломается. - person J J; 30.07.2019
comment
Определение @JobinJoseph test.product.release.version является обязательным условием как часть самого вопроса. Очевидно, что если он не определен и не используется с @Value, приложение вообще не запустится. - person Madhu Bhat; 30.07.2019
comment
Так что лучше использовать @ConfigurationProperties см. здесь stackoverflow.com/a/47178928/2893693 - person J J; 30.07.2019
comment
@JobinJoseph @ConfigurationProperties - это просто еще один способ использования свойств, но суть вопроса не в этом. - person Madhu Bhat; 30.07.2019