Spring 配置使用 yaml 创建复杂的数据结构

Spring Configuration creating complex data structure with yaml

在我的 Spring-boot 应用程序中使用 yaml(具有 snakeyaml 依赖项 1.16)我正在尝试基于我的 application.yml 文件创建一个 @ConfigurationProperties。我想创建一个像下面的 json 这样的数据结构,它是一个带有字符串键和数组值的映射。

mapName: {
    "key1": ["elem0","elem1"],
    "key2": ["hello","world"]
}

正在尝试创建 Spring 配置 class 如下

@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']

我也试过在 @ConfigurationProperties class 中初始化 HashMap ... new HashMap<String, Set<String>> 这也没有用

所有尝试都会导致此错误,这让我相信它是转换为对象时的错误,而不是 yaml 语法有任何问题。

Caused by: org.springframework.beans.InvalidPropertyException: Invalid property 'brokerTest[message-delivery][0]' of bean class [my.classpackage.clasname]: Property referenced in indexed property path 'brokerTest[message-delivery][0]' is neither an array nor a List nor a Map; returned value was [all]

是否可以创建这样的对象?我将如何完成这个

-更新-

如果我将 Set 更改为 ArrayList(或 List 接口),这会起作用,但这不是我想要的。改成了这个

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

但需要这不适用于 Set 接口:

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

你要找的是这个:

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

Complete idiot's introduction to yaml

这个问题是由 yaml 文件的格式引起的。以下结构允许我用 yaml

构建我的图形数据结构
channel-broker:
   broker:
       message-delivery: 
          all
       facebook: 
          client1,client2

Set 不需要围绕键的任何额外内容。请注意,如果您的 Set 将包含多个值,您可以添加一个逗号来分隔它们。就像 Json 最后一个元素后面没有逗号。

如果你使用 [] 那么它是一个数组,所以 arraylist 可以工作,对于 hashset/hashmap 你需要使用 {} 括号。

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

将适用于哈希集。

(hashmap example)