Java 原因:元素未绑定

Java 原因:元素未绑定,java,spring-boot,configuration,Java,Spring Boot,Configuration,如何在JavaSpringBoot应用程序中从配置yml文件加载对象列表 我已经尝试了几个来源: 堆栈:Java11,SpringBoot2.1.4,Lombok,配置文件为.yml格式 我尝试实现简单的@Component,它将从配置文件加载数据 配置值为: allowed: - first-crossroad: ONE second-crossroad: TWO third-crossroad: TWO fourth-crossroad: THREE -

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

我已经尝试了几个来源:

堆栈:Java11,SpringBoot2.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类是:

@配置
@EnableConfigurationProperties
@ConfigurationProperties(前缀=“”)
@资料
公共类允许的十字路口{
允许私人名单;
}
Java CrossroadCombination对象定义:

@数据
@建筑商
@AllArgsConstructor
公共级交叉路口组合{
私人十字路口;
私人十字路口;
私人第三横道;;
私人串第四十字路口;
}
我希望在应用程序运行期间加载值。但我得到了一个错误:

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]
[first-crossroad= ONE, second-crossroad= TWO, third-crossroad= TWO,fourth-crossroad= THREE,first-crossroad= ONE, second-crossroad= THREE,third-crossroad= TWO, fourth-crossroad= ONE]
“[]”不是必需的,但它使它看起来更可读

然后你这样称呼它:

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]
[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]
[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 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]
[first-crossroad= ONE, second-crossroad= TWO, third-crossroad= TWO,fourth-crossroad= THREE,first-crossroad= ONE, second-crossroad= THREE,third-crossroad= TWO, fourth-crossroad= ONE]
“[]”不是必需的,但它使它看起来更可读

然后你这样称呼它:

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]
[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]
[first-crossroad= ONE, second-crossroad= TWO, third-crossroad= TWO,fourth-crossroad= THREE,first-crossroad= ONE, second-crossroad= THREE,third-crossroad= TWO, fourth-crossroad= ONE]
然后,您可以将其投射到阵列中,或像这样使用它。

(众多解决方案之一):

  • 添加:@noargsconstuctor
到java类:

@数据
@建筑商
@AllArgsConstructor
@诺尔格构装师
公共级交叉路口组合{
私人十字路口;
私人十字路口;
私人第三横道;;
私人串第四十字路口;
}
说明:

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

不管怎样,“@Daniel V”的解决方案也是正确的,谢谢

(众多解决方案之一):

  • 添加:@noargsconstuctor
到java类:

@数据
@建筑商
@AllArgsConstructor
@诺尔格构装师
公共级交叉路口组合{
私人十字路口;
私人十字路口;
私人第三横道;;
私人串第四十字路口;
}
说明:

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


不管怎样,“@Daniel V”的解决方案也是正确的,谢谢

将内部类设置为静态将起作用

@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;
    }
}
@配置
@EnableConfigurationProperties
@ConfigurationProperties(前缀=“”)
@资料
公共类允许的十字路口{
允许私人名单;
@资料
公共静态类交叉组合{
私人十字路口;
私人十字路口;
私人第三横道;;
私人串第四十字路口;
}
}

将内部类设置为静态将起作用

@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;
    }
}
@配置
@EnableConfigurationProperties
@ConfigurationProperties(前缀=“”)
@资料
公共类允许的十字路口{
允许私人名单;
@资料
公共静态类交叉组合{
私人十字路口;
私人十字路口;
私人第三横道;;
私人串第四十字路口;
}
}

包括所有字段的getter和setter解决了问题

包括所有字段的getter和setter解决了问题

我如何使用它来填充列表?因为我有两个first crossroad属性,这个属性将调用什么值:configApp.getString(“first crossroad”);返回?嘿,伙计,这是一个问题,但我做了一些测试,如果你想使用resourcebundle库,你必须把你的数据放在配置文件中,就像编辑一样,我会在我的回答中发布你谢谢,这看起来是一个解决方案!但我刚刚发现,这个问题在龙目岛。当我将@noargsconstuctor添加到class:crossroadcomposition时,它会按预期工作。这可能是因为对象首先被初始化,然后被数据填充。这就是为什么我们需要这个构造函数。无论如何,谢谢你!可以我很高兴你们找到了解决办法:我怎样才能用它来填清单呢?因为我有两个first crossroad属性,这个属性将调用什么值:configApp.getString(“first crossroad”);返回?嘿,伙计,这是一个问题,但我做了一些测试,如果你想使用resourcebundle库,你必须把你的数据放在配置文件中,就像编辑一样,我会在我的回答中发布你谢谢,这看起来是一个解决方案!但我刚刚发现,这个问题在龙目岛。当我将@noargsconstuctor添加到class:crossroadcomposition时,它会按预期工作。这可能是因为对象首先被初始化,然后被数据填充。这就是为什么我们需要这个构造函数。无论如何,谢谢你!可以我很高兴你找到了解决办法:染料,这是我的解决办法。太好了~是的,这是我的解决方案。伟大的~