2016-11-20 131 views
2

在我的春天启动的应用程序(与snakeyaml依赖性1.16)使用YAML我试图根据关我application.yml文件的创建@ConfigurationProperties复杂的数据结构。我想创建像下面的JSON是具有字符串键和数组值的地图的数据结构。Spring配置文件创建与YAML

mapName: { 
    "key1": ["elem0","elem1"], 
    "key2": ["hello","world"] 
} 

尝试如下

@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下面创建一个Spring配置类

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

尝试2

channel-broker: 
     message-delivery: ['all'] 
     facebook: ['client1'] 

尝试3

channel-broker: 
     message-delivery: 
     - ['all'] 
     facebook: 
     - ['client1'] 

我也试图在@ConfigurationProperties类这样... new HashMap<String, Set<String>>初始化HashMap中并没有工作或者

所有的尝试导致这个错误,使我相信它的错误转换为对象时不yaml语法有任何问题。

所致:org.springframework.beans.InvalidPropertyException:无效 属性 'brokerTest [消息交付] [0]' bean类的 [my.classpackage.clasname]: 属性,索引属性路径引用 “brokerTest [消息交付] [0]”既不是一个数组,也不是一个列表,也不是 地图;返回值为[全部]

是否可以创建这样的对象?我将如何做到这一点

-UPDATE-

如果我改变设置到一个ArrayList(或List接口)这个工作,但不是我要找的。改变这种

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

但需要这不符合设置接口工作,要么:

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

回答

0

这个问题是由YAML文件的格式造成的。下面的结构让我打造出来的YAML

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

我喜欢图形数据结构的设置不​​希望任何额外周围的关键。请注意,如果您的设置将包含多个值,您可以添加一个逗号将它们分开。就像Json的最后一个元素之后不会有一个逗号。

0

你所寻找的是这样的:

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

看到Complete idiot's introduction to yaml

+0

这产生如我先前接收到的同样的错误,这是“在索引属性路径‘经纪人[消息交付] [0]’既不是一个数组,也不是一个列表,也不是一个地图引用属性;返回值为[全部]“ –

0

如果你使用[]那么它是一个数组,因此arraylist工作,对于hashset/hashmap你需要使用{}括号。

channel-broker: { 
    broker: { 
     message-delivery:{'all', '123'}, 
     facebook:{'client1', 'cleant2'} 
    } 
} 

将用于hashset。

hashmap example