чтение динамического списка свойств в управляемый bean-компонент - PullRequest
27 голосов
/ 11 марта 2011

Я искал, но не могу найти эти шаги. Я надеюсь, что упускаю что-то очевидное.

У меня есть файл свойств со следующим содержимым:

machines=A,B

У меня есть другой файл, подобный этому, но с другим количеством элементов в элементе machines, например:

machines=B,C,D

У меня вопрос: как я могу загрузить эту машинную переменную переменной длины в bean-компонент в моем весеннем конфиге обычным способом?

примерно так:

<property name="machines" value="${machines}"/>

где машины - это массив или список в моем коде Java. Я могу определить это так, как хочу, если смогу понять, как это сделать.

По сути, я бы предпочел, чтобы spring выполнял синтаксический анализ и вставлял каждое значение в элемент списка, вместо того, чтобы мне приходилось писать что-то, что читает в строке полной машины, и выполнять синтаксический анализ самостоятельно (с разделителем запятых) для установки каждого значения. в массив или список. Есть ли простой способ сделать это, что я скучаю?

Ответы [ 5 ]

31 голосов
/ 11 марта 2011

Возможно, вы захотите взглянуть на класс Spring StringUtils. Он имеет ряд полезных методов для преобразования списка через запятую в массив Set или String. Вы можете использовать любой из этих служебных методов, используя среду фабричного метода Spring, чтобы ввести проанализированное значение в ваш bean-компонент. Вот пример:

<property name="machines">
    <bean class="org.springframework.util.StringUtils" factory-method="commaDelimitedListToSet">
        <constructor-arg type="java.lang.String" value="${machines}"/>
    </bean>
</property>

В этом примере значение 'machines' загружается из файла свойств.

Если существующий служебный метод не удовлетворяет вашим потребностям, создать свой собственный довольно просто. Этот метод позволяет вам выполнить любой метод статической утилиты.

19 голосов
/ 14 марта 2012

Spring EL делает проще.Java:

List <String> machines;

Контекст:

<property name="machines" value="#{T(java.util.Arrays).asList('${machines}')}"/>
16 голосов
/ 11 июля 2011

Если вы сделаете свойство "machines" массивом String, то Spring сделает это автоматически за вас

machines=B,C,D

<property name="machines" value="${machines}"/>

public void setMachines(String[] test) {
4 голосов
/ 04 ноября 2013

Начиная с Spring 3.0, также можно читать в списке значений, используя аннотацию @Value.

Файл свойств:

machines=B,C,D

Код Java:

import org.springframework.beans.factory.annotation.Value;

@Value("#{'${machines}'.split(',')}")
private List<String> machines;
0 голосов
/ 16 ноября 2018

Вы можете ввести значения в список напрямую без стандартного кода. (Spring 3.1 +)

@Value("${machines}")
private List<String> machines;

для ключа "machines = B, C, D" в файле свойств, создав следующие дваэкземпляр в вашей конфигурации.

@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}

@Bean 
public ConversionService conversionService() {
    return new DefaultConversionService();
}

Они будут охватывать все отдельные разделенные и разделенные пробелы.

...