Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring配置使用yaml创建复杂的数据结构_Java_Spring_Spring Boot_Yaml_Snakeyaml - Fatal编程技术网

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

Java Spring配置使用yaml创建复杂的数据结构,java,spring,spring-boot,yaml,snakeyaml,Java,Spring,Spring Boot,Yaml,Snakeyaml,在我的Spring boot应用程序中使用yaml(使用snakeyaml dependency 1.16),我试图基于application.yml文件创建一个@ConfigurationProperties。我想创建一个数据结构,比如下面的json,它是一个带有字符串键和数组值的映射 mapName: { "key1": ["elem0","elem1"], "key2": ["hello","world"] } 正在尝试创建一个Spring配置类,如下所示 @Compon

在我的Spring boot应用程序中使用yaml(使用snakeyaml dependency 1.16),我试图基于application.yml文件创建一个
@ConfigurationProperties
。我想创建一个数据结构,比如下面的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;
    }
}
第二次尝试

channel-broker:
      message-delivery: ['all']
      facebook: ['client1']
第三次尝试

channel-broker:
      message-delivery: 
        - ['all']
      facebook: 
        - ['client1']
我还尝试在
@ConfigurationProperties
类中初始化HashMap,例如
。。。新建HashMap
这也不起作用

所有的尝试都会导致这个错误,这让我相信这是转换到对象时的错误,而不是yaml语法有任何错误

原因:org.springframework.beans.InvalidPropertyException:无效 bean类的属性“brokerTest[消息传递][0]” [my.classpackage.clasname]: 索引属性路径中引用的属性 “brokerTest[message delivery][0]”既不是数组,也不是列表,也不是 地图;返回值为[全部]

有可能创建这样一个对象吗?我将如何实现这一点

-更新-

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

private Map<String, ArrayList<String>> brokerTest = new HashMap<>();
private-Map-brokerTest=new-HashMap();
但这也不适用于Set接口:

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

您要找的是:

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

请参见

此问题是由yaml文件的格式引起的。下面的结构允许我用yaml构建类似于图形的数据结构

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

电视机不希望钥匙周围有任何额外的东西。注意:如果集合包含多个值,则可以添加逗号将它们分隔开。就像Json一样,最后一个元素后面不会有逗号

如果您使用
[]
则它是一个数组,因此arraylist可以工作,对于hashset/hashmap,您需要使用
{}
括号

channel-broker: {
    broker: {
        message-delivery:{'all', '123'}, 
        facebook:{'client1', 'cleant2'}
    }
}
将为hashset工作


()

这会产生与我之前收到的错误相同的错误,即“索引属性路径'broker[message delivery][0]中引用的属性既不是数组,也不是列表,也不是映射;返回的值是[all]”
channel-broker: {
    broker: {
        message-delivery:{'all', '123'}, 
        facebook:{'client1', 'cleant2'}
    }
}