【问题标题】:Spring Configuration creating complex data structure with yamlSpring Configuration 使用 yaml 创建复杂的数据结构
【发布时间】:2017-04-03 20:48:43
【问题描述】:

在我的 Spring-boot 应用程序中使用 yaml(具有 snakeyaml 依赖项 1.16)我正在尝试基于我的 application.yml 文件创建一个 @ConfigurationProperties。我想创建一个像下面的 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&lt;String, Set&lt;String&gt;&gt; 这也不起作用

所有尝试都会导致此错误,这让我相信在转换为对象时这是一个错误,而不是 yaml 语法有任何问题。

原因:org.springframework.beans.InvalidPropertyException: Invalid bean 类的属性“brokerTest[message-delivery][0]” [my.classpackage.classname]: 索引属性路径中引用的属性 'brokerTest[message-delivery][0]' 既不是数组也不是 List 也不是 地图;返回值为 [all]

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

-更新-

如果我将 Set 更改为 ArrayList(或 List 接口),这可行,但这不是我想要的。改成这个了

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

但需要这也不适用于 Set 接口:

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

【问题讨论】:

    标签: java spring spring-boot yaml snakeyaml


    【解决方案1】:

    这个问题是由 yaml 文件的格式引起的。以下结构允许我用 yaml 构建类似数据结构的图形

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

    Set 不希望键周围有任何额外的东西。请注意,如果您的 Set 将包含多个值,您可以添加逗号来分隔它们。就像 Json 一样,最后一个元素后面不会有逗号。

    【讨论】:

      【解决方案2】:

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

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

      适用于哈希集。

      (hashmap example)

      【讨论】:

        【解决方案3】:

        你要找的是这个:

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

        Complete idiot's introduction to yaml

        【讨论】:

        • 这会产生与我之前收到的相同错误,即“索引属性路径'broker [message-delivery] [0]'中引用的属性既不是数组也不是列表也不是地图;返回值是[全部]”
        猜你喜欢
        • 2020-07-16
        • 1970-01-01
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-12
        • 1970-01-01
        • 2017-09-10
        相关资源
        最近更新 更多