Java Spring配置使用yaml创建复杂的数据结构
在我的Spring boot应用程序中使用yaml(使用snakeyaml dependency 1.16),我试图基于application.yml文件创建一个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
@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'}
}
}