Spring Configuration создает сложную структуру данных с помощью yaml
Используя yaml в моем приложении Spring-boot (с зависимостью snakeyaml 1.16), я пытаюсь создать @ConfigurationProperties
основанный на моем файле application.yml. Я хочу создать структуру данных, такую как json ниже, которая представляет собой Map со значениями String Keys и Array.
mapName: {
"key1": ["elem0","elem1"],
"key2": ["hello","world"]
}
Попытка создать класс конфигурации Spring следующим образом
@Component
@ConfigurationProperties(prefix = "channel-broker")
@EnableConfigurationProperties
public class BrokerConfiguration {
private Map<String, Set<String>> broker = new HashMap<>();
public Map<String, Set<String>> getBroker() {
return broker;
}
}
Я попробовал следующее для моего yaml
channel-broker:
broker: {message-delivery: ['all'], facebook: ['client1']}
Попытка два
channel-broker:
message-delivery: ['all']
facebook: ['client1']
Попытка три
channel-broker:
message-delivery:
- ['all']
facebook:
- ['client1']
Я также попытался инициализировать HashMap в @ConfigurationProperties
класс как таковой ... new HashMap<String, Set<String>>
это тоже не сработало
Все попытки приводят к этой ошибке, которая заставляет меня полагать, что это ошибка при преобразовании в объект, а не в том, что с синтаксисом yaml что-то не так.
Вызывается: org.springframework.beans.InvalidPropertyException: недопустимое свойство 'brokerTest[message-delivery][0]' класса бина [my.classpackage.clasname]: свойство, на которое есть ссылка в пути индексированного свойства 'brokerTest [message-delivery] [0 ] 'не является ни массивом, ни списком, ни картой; возвращаемое значение было [все]
Можно ли создать такой объект? Как бы я этого достиг
-ОБНОВИТЬ-
Если я изменяю Set на ArrayList (или интерфейс List), это работает, но это не то, что я ищу. поменял на это
private Map<String, ArrayList<String>> brokerTest = new HashMap<>();
но нужно, чтобы это тоже не работало с интерфейсом Set:
private Map<String, HashSet<String>> brokerTest = new HashMap<>();
3 ответа
Эта проблема была вызвана форматом файла yaml. Следующая структура позволила мне построить мой график как структуру данных из yaml
channel-broker:
broker:
message-delivery:
all
facebook:
client1,client2
Набор не хочет ничего лишнего вокруг ключа. Обратите внимание, что если ваш Set будет содержать несколько значений, вы можете добавить запятую для их разделения. Как и у Джсона, последний элемент не будет иметь запятую после.
То, что вы ищете, это:
channel-broker: {broker: {message-delivery:['all', ...], facebook:['client1', ...]}}
увидеть полное введение идиота в yaml
Если вы используете []
тогда это массив, так что arraylist работает, для hashset/hashmap вам нужно использовать {}
скобки.
channel-broker: {
broker: {
message-delivery:{'all', '123'},
facebook:{'client1', 'cleant2'}
}
}
будет работать на хэшсет.