java - Spring Configuration 使用 yaml 创建复杂的数据结构

标签 java spring spring-boot yaml snakeyaml

在我的 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/

相关文章:

java - 访问自定义 Maven 报告插件中的类

@RequestBody 上的 Spring @InitBinder

spring-boot - 需要为ElasticsearchRepository findBy查询编写自定义分析器

java - 无法在 Spring 中配置用于集成测试的模块 - 没有可用的任务

java - 如何将元素从一维数组传递到二维数组

java - 主 spring bean 被配置中的 ImportResource 覆盖

java - Hadoop Java 客户端 API 弄乱了我的 fsURI

java - CreateProcess error=206,运行gwtCompile时文件名或扩展名太长

java - Jackson 无法解析 ISO8601

java - 对具有多版本实现的模块使用 jdeps,但根模块没有