Конфигурация Spring, создающая сложную структуру данных с помощью yaml

Используя yaml в моем приложении Spring-boot (с зависимостью snakeyaml 1.16), я пытаюсь создать @ConfigurationProperties на основе моего файла application.yml. Я хочу создать структуру данных, такую ​​как json ниже, которая представляет собой карту со строковыми ключами и значениями массива.

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 [доставка-сообщения] [0]' класса bean-компонента [my.classpackage.clasname]: свойство, указанное в пути индексированного свойства 'brokerTest [доставка-сообщения] [0 ] 'не является ни массивом, ни списком, ни картой; возвращенное значение было [все]

Можно ли создать такой объект? Как бы мне этого добиться?

-ОБНОВИТЬ-

Если я изменю Set на ArrayList (или интерфейс List), это будет работать, но это не то, что я ищу. изменено на это

private Map<String, ArrayList<String>> brokerTest = new HashMap<>();

но это не работает и с интерфейсом Set:

private Map<String, HashSet<String>> brokerTest = new HashMap<>();

person Marquis Blount    schedule 20.11.2016    source источник


Ответы (3)


Эта проблема была вызвана форматом файла yaml. Следующая структура позволила мне построить свой график как структуру данных из yaml

channel-broker:
   broker:
       message-delivery: 
          all
       facebook: 
          client1,client2

Сет не хочет ничего лишнего вокруг ключа. Обратите внимание, если ваш Set будет содержать несколько значений, вы можете добавить их запятую. Как и в случае с Json, после последнего элемента не будет запятой.

person Marquis Blount    schedule 21.11.2016

Вы ищете это:

channel-broker: {broker: {message-delivery:['all', ...], facebook:['client1', ...]}}

см. Полное введение идиота в yaml

person Issam El-atif    schedule 20.11.2016
comment
это приводит к той же ошибке, которую я получил ранее, а именно: Свойство, указанное в пути индексированного свойства 'broker [message-delivery] [0]' не является ни массивом, ни списком, ни картой; возвращенное значение было [все] - person Marquis Blount; 20.11.2016

Если вы используете [], тогда это массив, поэтому работает arraylist, для hashset / hashmap вам нужно использовать {} скобки.

channel-broker: {
    broker: {
        message-delivery:{'all', '123'}, 
        facebook:{'client1', 'cleant2'}
    }
}

будет работать для hashset.

(пример хэш-карты)

person Ajay Raman    schedule 14.11.2017