Файл Spring .properties: получить элемент как массив

94

Я загружаю атрибуты свойств из .propertiesфайла с помощью Spring следующим образом:

file: elements.properties
base.module.elementToSearch=1
base.module.elementToSearch=2
base.module.elementToSearch=3
base.module.elementToSearch=4
base.module.elementToSearch=5
base.module.elementToSearch=6

XML-файл spring

file: myapplication.xml
<bean id="some"
      class="com.some.Class">
      <property name="property" value="#{base.module.elementToSearch}" />
</bean>

И мой Class.java

file: Class.java
public void setProperty(final List<Integer> elements){
    this.elements = elements;
}

Но при отладке элементы параметров получают только последний элемент в списке, поэтому есть список из одного элемента со значением «6», а не список из 6 элементов.

Я пробовал другие подходы, такие как добавление только значения, #{base.module}но затем он не находил параметра в файле свойств.

Обходной путь - иметь в файле elements.properties список, разделенный запятыми, например:

base.module.elementToSearch=1,2,3,4,5,6

и использовать его как строку и проанализировать ее, но есть ли лучшее решение?

РамонБоза
источник
поэтому мне нужно передать его как строку, разделенную запятыми, и выполнить синтаксический анализ в методе.
RamonBoza
Вот ответ, который по крайней мере дает результат Set <String>. Не совсем List <String>, но, вероятно, во многих случаях достаточно! stackoverflow.com/questions/5274362/…
Джон Рикс

Ответы:

194

Если вы определяете свой массив в файле свойств, например:

base.module.elementToSearch=1,2,3,4,5,6

Вы можете загрузить такой массив в свой класс Java следующим образом:

  @Value("${base.module.elementToSearch}")
  private String[] elementToSearch;
свлада
источник
5
Мои элементы содержат запятую. Как мне избежать разделителя? '\,' даже '\\,' не работают.
banterCZ
Вы можете попытаться получить их как список целых чисел, а затем преобразовать их @Value ("$ {base.module.elementToSearch}") private List <Integer> elementToSearch;
Гал Браха
+1, как раз то, что мне нужно. К сожалению, чтение значений, разделенных запятыми, в a List<String>таким же образом, похоже, не работает (в списке будет только один элемент).
Jonik
5
Я могу подтвердить, что использование String[]as type работает, где использование List<String>не работает.
Wim Deblauwe
3
Если вы хотите, чтобы это работало List<String>вместо String[], вам нужно добавить как минимум a <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">в ваш applicationContext.xml. В противном случае служба преобразования не используется, а используются редакторы свойств по умолчанию, которые не поддерживают преобразование строк в коллекции, а только массивы: docs.spring.io/spring/docs/current/spring-framework-reference/…
Clemens Klein-Robbenhaar
37

И если у вас другой разделитель, кроме запятой, вы также можете использовать его.

@Value("#{'${my.config.values}'.split(',')}")
private String[] myValues;   // could also be a List<String>

а также

в свойствах вашего приложения вы могли бы иметь

my.config.values=value1, value2, value3
РК Пунджал
источник
это использование также работает с другими аннотациями, я использовал, например, @KafkaListener {themes = "# {'$ {ArrayProperty}'. split (',')}"} для весеннего слушателя
kafka
32

Вот пример того, как это можно сделать в Spring 4.0+

application.properties содержание:

some.key=yes,no,cancel

Код Java:

@Autowire
private Environment env;

...

String[] springRocks = env.getProperty("some.key", String[].class);
Юха Ханка
источник
это то, что я хочу, но в env vars ... Я должен иметь возможность использовать SOME_KEY_0_ = yes SOME_KEY_1 = no и т.д. в env vars, но мой getProperty возвращается null
Rhubarb
1

С помощью Spring Boot можно делать следующее:

application.properties

values[0]=abc
values[1]=def

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

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
@ConfigurationProperties
public class Configuration {

    List<String> values = new ArrayList<>();

    public List<String> getValues() {
        return values;
    }

}

Это необходимо, без этого класса или без valuesкласса in он не работает.

Класс приложения Spring Boot

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.List;

@SpringBootApplication
public class SpringBootConsoleApplication implements CommandLineRunner {

    private static Logger LOG = LoggerFactory.getLogger(SpringBootConsoleApplication.class);

    // notice #{} is used instead of ${}
    @Value("#{configuration.values}")
    List<String> values;

    public static void main(String[] args) {
        SpringApplication.run(SpringBootConsoleApplication.class, args);
    }

    @Override
    public void run(String... args) {
        LOG.info("values: {}", values);
    }

}
Betlista
источник
0

Если вам нужно передать символ звездочки, вы должны заключить его в кавычки.

В моем случае мне нужно настроить cors для веб-сокетов. Итак, я решил поместить URL-адреса cors в application.yml. Для prod env я буду использовать определенные URL-адреса, но для разработчиков можно использовать только *.

В yml файле у меня есть:

websocket:
  cors: "*"

В классе Config у меня есть:

@Value("${websocket.cors}")
private String[] cors;
Руслан Шеремет
источник