Spring配置使用yaml创建复杂的数据结构

时间:2016-11-20 11:36:50

标签: java spring spring-boot yaml snakeyaml

在我的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<>();

3 个答案:

答案 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', ...]}}

请参阅Complete idiot's introduction to yaml

答案 2 :(得分:0)

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

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

将适用于hashset。

hashmap example