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