Я хочу иметь список значений в файле .properties, а именно:
my.list.of.strings=ABC,CDE,EFG
И загрузить это в моем классе непосредственно, то есть:
@Value("${my.list.of.strings}")
private List<String> myList;
Как я понимаю, альтернативой для этого является включение его в конфигурационный файл Spring и загрузка его в качестве ссылки на компонент (поправьте меня, если я ошибаюсь), т.е.
<bean name="list">
<list>
<value>ABC</value>
<value>CDE</value>
<value>EFG</value>
</list>
</bean>
Но есть ли способ сделать это? используя файл .properties? PS: Я хотел бы сделать это без любого пользовательского кода, если это возможно.
java
spring
spring-properties
JackDev
источник
источник
org.springframework.expression.spel.SpelEvaluationException
исключение и нетjavax.el.ELException
. Ваш возражение создано весной?my.list.of.strings=
? Я ожидаю, что такая функциональность перезапускает пустой список, где здесь будет один элемент (пустая строка), не так ли?item1, item2, item3
могут дать результат, которого вы не ожидаете (подсказка: пробелы).@Value("#{'${my.list.of.strings}'.split(',\\s*')}")
Начиная с Spring 3.0, вы можете добавить строку вроде
на ваш
applicationContext.xml
(или где вы настраиваете вещи). Как отмечает Дмитрий Чорный в комментарии, конфигурация на основе Java выглядит следующим образом:Это активирует новую службу конфигурации, которая поддерживает преобразование
String
вCollection
типы. Если вы не активируете эту службу конфигурации, Spring вернется к своим прежним редакторам свойств в качестве служб конфигурации, которые не поддерживают этот вид преобразования.Преобразование в коллекции других типов работ тоже:
будет работать с такой строкой
Никаких проблем с пробелами нет, об этом
ConversionServiceFactoryBean
позаботятся.См. Http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#core-convert-Spring-config
источник
split()
в каждом выражении, он также правильно обрабатывает пустой список вместо того, чтобы давать вам[null]
Если вы читаете это и используете Spring Boot , у вас есть еще 1 опция для этой функции
Обычно разделенные запятыми списки очень неуклюжи для реального случая использования (и иногда даже неосуществимы, если вы хотите использовать запятые в вашей конфигурации):
С помощью Spring Boot вы можете написать это так (индекс начинается с 0):
И используйте это так:
источник
Указав
my.list.of.strings=ABC,CDE,EFG
в файле .properties и используя@Value("${my.list.of.strings}")
private String[] myString;
Вы можете получить массивы строк. И используя
CollectionUtils.addAll(myList, myString)
, вы можете получить список строк.источник
Рассматривали ли вы
@Autowired
конструктор или сеттер иString.split()
тело?Я предпочитаю выполнять автопроводку одним из этих способов, чтобы улучшить тестируемость моего кода.
источник
Если вы используете Spring Boot 2, он работает как есть, без какой-либо дополнительной настройки.
источник
private List<String> myList;
Все приведенные выше ответы верны. Но вы можете достичь этого только в одной строке. Пожалуйста, попробуйте следующее объявление, и вы получите все значения через запятую в списке строк.
А также вам нужно иметь следующую строку, определенную в вашей конфигурации xml.
просто замените путь и имя вашего файла свойств. И тебе хорошо идти. :)
Надеюсь, это поможет вам. Приветствия.
источник
@Value("#{T(java.util.Arrays).asList('${my.list.of.strings}')}")
Если вы используете последнюю версию Spring Framework (Spring 3.1+, я полагаю), вам не нужны эти разделенные строки в SpringEL,
Просто добавьте PropertySourcesPlaceholderConfigurer и DefaultConversionService в свой класс конфигурации Spring (класс с пометкой «Конфигурация»), например,
и в вашем классе
и в файле свойств
Без DefaultConversionService вы можете использовать String в массиве String только в том случае, если вы вводите значение в свое поле, но DefaultConversionService выполняет несколько удобных для вас действий и добавляет их в Collection, Array и т. Д. (Проверьте реализацию, если хотите хотел бы узнать больше об этом)
С этими двумя он даже обрабатывает все лишние пробелы, включая символ новой строки, поэтому вам не нужно добавлять дополнительную логику, чтобы обрезать их.
источник
Вы можете сделать это с помощью аннотаций, как это
здесь my.list.of.strings будут выбраны из файла свойств, если его там нет, то будут использоваться значения по умолчанию a, b, c
и в вашем файле свойств, вы можете иметь что-то вроде этого
my.list.of.strings = д, д, е
источник
Остерегайтесь пробелов в значениях. Я могу ошибаться, но я думаю, что пробелы в списке через запятую не усекаются с помощью @Value и Spel. Список
будет читаться как список строк
В большинстве случаев вы, вероятно, не хотели бы места!
Выражение
даст вам список строк:
Регулярное выражение удаляет все пробелы непосредственно перед и сразу после запятой. Пробелы внутри значений не удаляются. Так
должен привести к значениям
источник
@Value("#{'${foobar}'.trim().split( *, *)}")
Я думаю, что это проще для захвата массива и удаления пробелов:
источник
В моем случае список целых чисел работает так:
Файл свойств:
источник
Рассмотрите возможность использования Commons Configuration. Он имеет встроенную функцию, чтобы разбить запись в файле свойств в массив / список. Объединение со SpEL и @Value должно дать то, что вы хотите
В соответствии с просьбой, вот что вам нужно (на самом деле не пробовал код, возможно, есть некоторые опечатки, пожалуйста, потерпите меня):
В конфигурации Apache Commons есть PropertiesConfiguration. Он поддерживает функцию преобразования строки с разделителями в массив / список.
Например, если у вас есть файл свойств
С кодом ниже:
даст вам массив строк
["bar1", "bar2", "bar3"]
Для использования с Spring, имейте это в вашем приложении xml:
и имейте это в своем весеннем бобе:
Я считаю, что это должно работать: P
источник
Мой предпочтительный способ (в частности, для строк) следующий:
и использовать
Таким образом, вы также можете включить запятые в ваш параметр. Это работает также для наборов.
источник
если использовать заполнители свойств, то пример ser1702544 станет
С заполнителем xml:
источник
Я использую Spring Boot 2.2.6
Мой файл свойств:
Мой код:
Работает нормально
источник