Я хочу разделить значение свойства, определенного 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?
@Deadpool Я не хочу этого, потому что хочу снова использовать свойство test.product.release.year в качестве значения для другого свойства.
попробуйте мой ответ, я проверил его и работает
С моей точки зрения, вы должны рассмотреть другую точку зрения:
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}
Я не могу использовать два свойства, потому что значение свойства test.product.release.version.year не контролируется установщиком, который я не хочу трогать.
Используйте следующее выражение. Это сработает.
@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;
Вы можете получить год в контроллере напрямую
@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;
test.product.release.version = "#{'${test.product.release.version}'.split('[.]')[1]}" по-прежнему дает мне значение, так как "#{'V2003.1'.split('[.]')[0]}" я получаю его через АннотацияОкружающая среда #getProperty
почему ты не используешь @Value ?
потому что вы упомянули в ответе Точно так же вы можете указать это выражение в файле свойств.
проверьте мой обновленный ответ, он работает для меня как в файле yml, так и в файле properties @Sameer
а также я тестировал с помощью env.getProperty("test.product.release.year", это дает мне "#{'2003.1'.split('[.]')[0]}", поэтому просто используйте @Value вместо env
А также вы можете задать другой вопрос, почему он возвращает выражение вместо значения при использовании Env извините, у меня нет этой информации @Sameer
Поскольку вы собираетесь иметь одно свойство и получить другое из первого, было бы лучше сделать это, как показано ниже:
приложение.свойства
test.product.release.version=2003.1
Класс конфигурации
@Value("${test.product.release.version}")
private String version;
@Value("#{'${test.product.release.version}'.split('\\.')[0]}")
private String year;
Если версия не настроена, {'${test.product.release.version}'.split('\\.')[0]} сломается.
Определение @JobinJoseph test.product.release.version является обязательным условием как часть самого вопроса. Очевидно, что если он не определен и не используется с @Value, приложение вообще не запустится.
Так что лучше использовать @ConfigurationProperties см. здесь stackoverflow.com/a/47178928/2893693
@JobinJoseph @ConfigurationProperties — это просто еще один способ использования свойств, но суть вопроса не в этом.
почему бы вам не загрузить его как массив?