Spring Конфигурация загрузочного ямля для списка строк

Я пытаюсь загрузить массив строк из файла application.yml. Это config:

ignore:
    filenames:
        - .DS_Store
        - .hg

Это класс:

@Value("${ignore.filenames}")
private List<String> igonoredFileNames = new ArrayList<>();

Существуют другие конфигурации в том же классе, которые загружаются просто отлично. В моем файле yaml нет вкладок. Тем не менее я получаю следующее исключение:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'ignore.filenames' in string value "${ignore.filenames}"

Ответ 1

Я думаю, что @Value не может справиться со "сложными" типами. Вы можете пойти с классом опоры как это:

@Component
@ConfigurationProperties('ignore')
class IgnoreSettings {
    List<String> filenames
}

Пожалуйста, обратите внимание: этот код Groovy, а не Java, для краткости примера! Смотрите комментарии для советов, как принять.

Смотрите полный пример https://github.com/christoph-frick/so-springboot-yaml-string-list

Ответ 2

используйте разделенные запятыми значения в application.yml

ignoreFilenames: .DS_Store, .hg

Java-код для доступа

@Value("${ignoreFilenames}")    
String[] ignoreFilenames

Это работает ;)

Ответ 3

Из весенних загрузочных документов https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

Списки YAML представлены в виде ключей свойств с разыменовывателями [index], например, это YAML:

my:
   servers:
       - dev.bar.com
       - foo.bar.com

Будет преобразован в эти свойства:

my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com

Для привязки к таким свойствам с помощью утилит Spring DataBinder (что и делает @ConfigurationProperties) вам нужно иметь свойство в целевом bean-компоненте типа java.util.List и вам нужно либо предоставить установщик, либо инициализировать его с помощью изменяемое значение, например, это будет привязано к свойствам выше Вот как будет выглядеть код вопроса.

@ConfigurationProperties(prefix="ignore")
public class Filenames {

    private List<String> ignoredFilenames = new ArrayList<String>();

    public List<String> getFilenames() {
        return this.ignoredFilenames;
    }
}

Ответ 4

В дополнение к ответу Ахмета вы можете добавить разрывы строк к строке, разделенной запятой, используя символ >.

application.yml:

ignoreFilenames: >
  .DS_Store, 
  .hg

Java-код:

@Value("${ignoreFilenames}")    
String[] ignoreFilenames;

Ответ 5

Ответ Ахмета дает представление о том, как назначать значения через запятую массиву String.

Чтобы использовать указанную выше конфигурацию в разных классах, вам может потребоваться создать для нее геттеры/сеттеры. Но если вы хотите загрузить эту конфигурацию один раз и продолжать использовать ее как компонент с аннотацией Autowired, вот как я это сделал:

В ConfigProvider.java

@Bean (name = "ignoreFileNames")
@ConfigurationProperties ( prefix = "ignore.filenames" )
public List<String> ignoreFileNames(){
    return new ArrayList<String>();
}

На внешних занятиях:

@Autowired
@Qualifier("ignoreFileNames")
private List<String> ignoreFileNames;

Вы можете использовать тот же список в любом месте, используя автопроводку.

Ответ 6

В моем случае это была проблема с синтаксисом в файле .yml. Я имел:

@Value("${spring.kafka.bootstrap-servers}")
public List<String> BOOTSTRAP_SERVERS_LIST;

и список в моем файле .yml:

bootstrap-servers:
  - s1.company.com:9092
  - s2.company.com:9092
  - s3.company.com:9092

не читал в аннотированное поле @Value. Когда я изменил синтаксис в файле .yml:

bootstrap-servers >
  s1.company.com:9092
  s2.company.com:9092
  s3.company.com:9092

это работало нормально.

Ответ 7

ignoreFilenames: .DS_Store, .hg

@Value("${ignoreFilenames}")    
String[] ignoreFilenames

то же, что и

@Value("${ignoreFilenames:.DS_Store, .hg}")    
String[] ignoreFilenames

Проблема не решена

Ответ 8

@Value("${your.elements}")    
private String[] elements;

YML файл:

your:
 elements: element1, element2, element3