【问题标题】:Reason: The elements were left unbound原因:元素未绑定
【发布时间】:2019-10-31 09:34:50
【问题描述】:

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

我已经尝试了几个来源:

configuration-properties-in-spring-boot

spring-boot-configurationproperties-example

SpringBoot 2 the elements were left unbound

堆栈:Java 11、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类是:

@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 spring-boot configuration


    【解决方案1】:

    包括所有字段的 Getter 和 Setter 解决了这个问题

    【讨论】:

      【解决方案2】:

      将 Inner 类设为静态会起作用

      @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;
          }
      }
      

      【讨论】:

      • 是的,这就是我的解决方案。太好了~
      【解决方案3】:

      (许多之一)解决方案:

      • 添加:@NoArgsConstructor

      到java类:

      @Data
      @Builder
      @AllArgsConstructor
      @NoArgsConstructor
      public class CrossroadCombination {
      
        private String firstCrossroad;
        private String secondCrossroad;
        private String thirdCrossroad;
        private String fourthCrossroad;
      }
      
      

      解释:

      这是因为当我们创建一个对象时,我们需要有一个空对象,然后用数据填充它。这就是我们不需要 args 构造函数的原因。

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

      【讨论】:

        【解决方案4】:

        您是否尝试过使用 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("允许");

        这将像这样存储它:

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

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

        【讨论】:

        • 我如何使用它来填充列表?因为我有两次 first-crossroad 属性,所以这会调用什么值: configApp.getString("first-crossroad");返回?
        • 嘿伙计,这是个问题,但我做了一些测试,如果你想使用 resourcebundle 库,你必须把你的数据放在配置文件中,就像我会在我的答案上发布你的编辑一样
        • 谢谢,这看起来像是一个解决方案!但我刚刚发现,这个问题在龙目岛。当我将:@NoArgsConstructor 添加到类:CrossroadCombination 时,它按预期工作。这可能是因为首先初始化对象然后填充数据。这就是我们需要这个构造函数的原因。无论如何,谢谢!
        • 好的!我很高兴你找到了解决方案:D
        猜你喜欢
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-29
        • 1970-01-01
        • 1970-01-01
        • 2016-04-17
        相关资源
        最近更新 更多