Весняний файл .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

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

Точно, хоча деякі бібліотеки вже роблять це за вас (apache commons) - commons.apache.org/configuration/howto_properties.html
Колін Геберт

Ось відповідь, яка принаймні дає вам результат Set <String>. Не зовсім <String>, але, мабуть, достатньо у багатьох випадках! stackoverflow.com/questions/5274362/…
Джон Рікс,

Відповіді:


193

Якщо ви визначите свій масив у файлі властивостей, як:

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, саме те, що мені потрібно. На жаль, List<String>однакове читання значень, розділених комами, здається не працює (у списку буде лише один елемент).
Йонік

5
Я можу підтвердити, що використання String[]як типу працює, якщо використання List<String>не працює.
Вім Деблауве,

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/…
Клеменс Кляйн-Роббенхаар

37

І якщо у вас є інший роздільник, крім коми, ви також можете використовувати це.

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

і

у властивостях програми, які ви могли б мати

my.config.values=value1, value2, value3

це використання також працює з іншими анотаціями, я використовував як @KafkaListener {topics = "# {'$ {ArrayProperty}'. split (',')}"} для слухача
весняного кафки

32

Ось приклад того, як це можна зробити навесні 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_ = так SOME_KEY_1 = ні тощо в env vars, але мій getProperty повертається нульовим
Ревінь

1

За допомогою Spring Boot можна зробити наступне:

застосування. властивості

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класу в класі це не працює.

Клас Spring Boot Application

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);
    }

}

0

Якщо вам потрібно передати символ зірочки, ви повинні обернути його лапками.

У моєму випадку мені потрібно налаштувати корди для веб-розеток. Отже, я вирішив застосувати URL-адреси cors у application.yml. Для prod env я буду використовувати конкретні URL-адреси, але для dev нормально використовувати просто *.

У файлі yml у мене є:

websocket:
  cors: "*"

У класі Config я маю:

@Value("${websocket.cors}")
private String[] cors;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.