在我的 Spring-boot 应用程序中使用 yaml(具有 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']
我还尝试在 @ConfigurationProperties
中初始化 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 接口(interface)),这会起作用,但这不是我想要的。改成了这个
private Map<String, ArrayList<String>> brokerTest = new HashMap<>();
但需要这也不适用于 Set 接口(interface):
private Map<String, HashSet<String>> brokerTest = new HashMap<>();
最佳答案
此问题是由 yaml 文件的格式引起的。以下结构允许我用 yaml 构建我的图形数据结构
channel-broker:
broker:
message-delivery:
all
facebook:
client1,client2
Set 不希望在键周围有任何额外的东西。请注意,如果您的 Set 将包含多个值,您可以添加一个逗号来分隔它们。就像 Json 最后一个元素后面不会有逗号。
关于java - Spring Configuration 使用 yaml 创建复杂的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40703552/