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', ...]}}
这个问题是由 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'}
}
}
将适用于哈希集。
在我的 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', ...]}}
这个问题是由 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'}
}
}
将适用于哈希集。