原因:元素未绑定

Reason: The elements were left unbound

如何在 java springboot 应用程序中从配置 yml 文件加载对象列表?

我已经尝试了几个来源:

configuration-properties-in-spring-boot

spring-boot-configurationproperties-example

堆栈:Java11、SpringBoot 2.1.4、Lombok、.yml格式的配置文件

我尝试实现简单的@Component,它将从配置文件加载数据。

配置值为:

allowed:
  - first-crossroad: ONE
    second-crossroad: TWO
    third-crossroad: TWO
    fourth-crossroad: THREE
  - first-crossroad: ONE
    second-crossroad: THREE
    third-crossroad: TWO
    fourth-crossroad: ONE

Java class 用于数据加载是:

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "")
@Data
public class AllowedCrossroads {

  private List<CrossroadCombination> allowed;
}

Java CrossroadCombination 对象定义:

@Data
@Builder
@AllArgsConstructor
public class CrossroadCombination {

  private String firstCrossroad;
  private String secondCrossroad;
  private String thirdCrossroad;
  private String fourthCrossroad;
}

我希望在应用程序期间加载值 运行。但我收到错误消息:

Property: allowed[0].first-crossroad
    Value: ONE
    Origin: class path resource [application.yml]:644:17
    Reason: The elements [allowed[0].first-crossroad,allowed[0].fourth-crossroad,allowed[0].second-crossroad,allowed[0].third-crossroad,allowed[1].first-crossroad,allowed[1].fourth-crossroad,allowed[1].second-crossroad,allowed[1].third-crossroad,allowed[2].first-crossroad,allowed[2].fourth-crossroad,allowed[2].second-crossroad,allowed[2].third-crossroad] were left unbound.

您尝试使用 java ResourceBundle 库了吗?

例如:

ResourceBundle configApp = ResourceBundle.getBundle("path to your configuration file");

之后你可以像这样使用 configApp:

configApp.getString("first-crossroad");

你能试试吗,然后告诉我效果如何。

编辑:

如果您计划使用 ResourceBundle,配置文件中的数据应该如下所示:

allowed=[first-crossroad= ONE, second-crossroad= TWO, third-crossroad= TWO,fourth-crossroad= THREE,first-crossroad= ONE, second-crossroad= THREE,third-crossroad= TWO, fourth-crossroad= ONE]

“[]”不是必需的,但它使它看起来更具可读性

那么你可以这样称呼它:

configApp.getObject("allowed");

将像这样存储它:

[first-crossroad= ONE, second-crossroad= TWO, third-crossroad= TWO,fourth-crossroad= THREE,first-crossroad= ONE, second-crossroad= THREE,third-crossroad= TWO, fourth-crossroad= ONE]

然后您可以将其转换为数组或像这样使用它。

(多选之一)解法:

  • 添加:@NoArgsConstructor

到javaclass:

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CrossroadCombination {

  private String firstCrossroad;
  private String secondCrossroad;
  private String thirdCrossroad;
  private String fourthCrossroad;
}

解释:

是因为我们在创建对象的时候,需要先有一个空的对象,然后再填充数据。这就是为什么我们不需要 args 构造函数。

无论如何,来自“@Daniel V”的解决方案也是正确的,感谢您提供的解决方案!

将 The Inner class 设为静态即可

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "")
@Data
public class AllowedCrossroads {

    private List<CrossroadCombination> allowed;

    @Data
    public static class CrossroadCombination {
        private String firstCrossroad;
        private String secondCrossroad;
        private String thirdCrossroad;
        private String fourthCrossroad;
    }
}

包括所有字段的 Getters 和 Setters 解决了问题

在我的例子中,变量名不匹配。请检查所有字段名称和映射配置键名称。