在我的Spring-boot应用程序中使用yaml(具有snakeyaml依赖性1.16)我试图基于我的application.yml文件创建一个@ConfigurationProperties
。我想创建一个像json这样的数据结构,下面是一个带有String Keys和Array值的Map。
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']
我也尝试在@ConfigurationProperties
类中初始化HashMap,... new HashMap<String, Set<String>>
这不起作用
所有尝试都会导致此错误,这使我在转换为对象时认为是错误,而不是yaml语法有任何问题。
引起:org.springframework.beans.InvalidPropertyException:无效 属性'brokerTest [message-delivery] [0]'的bean类 [my.classpackage.clasname]: 索引属性路径中引用的属性 'brokerTest [message-delivery] [0]'既不是数组也不是List也不是 地图;返回值是[全部]
是否可以创建这样的对象?我将如何完成此
-UPDATE-
如果我将Set更改为ArrayList(或List接口),这可以工作,但这不是我正在寻找的。改为这个
private Map<String, ArrayList<String>> brokerTest = new HashMap<>();
但需要这不适用于Set接口:
private Map<String, HashSet<String>> brokerTest = new HashMap<>();
答案 0 :(得分:1)
此问题是由yaml文件的格式引起的。以下结构允许我构建我的图形,如yaml的数据结构
channel-broker:
broker:
message-delivery:
all
facebook:
client1,client2
套装不需要任何额外的钥匙。请注意,如果您的Set包含多个值,则可以添加逗号以将它们分开。就像Json一样,最后一个元素之后不会有逗号。
答案 1 :(得分:0)
您正在寻找的是:
channel-broker: {broker: {message-delivery:['all', ...], facebook:['client1', ...]}}
答案 2 :(得分:0)
如果你使用[]
那么它是一个数组,所以arraylist工作,对于hashset / hashmap你需要使用{}
括号。
channel-broker: {
broker: {
message-delivery:{'all', '123'},
facebook:{'client1', 'cleant2'}
}
}
将适用于hashset。