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'}
    }
}

будет работать на хэшсет.

( пример hashmap)

Другие вопросы по тегам