原因:元素未绑定

时间:2019-06-17 18:53:31

标签: java spring-boot configuration

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

我已经尝试了几种来源:

configuration-properties-in-spring-boot

spring-boot-configurationproperties-example

SpringBoot 2 the elements were left unbound

Stack: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;
}

我希望在应用程序运行期间加载值。但是我遇到了错误:

属性:允许[0]。第一十字路口     价值:一     来源:类路径资源[application.yml]:644:17     原因:元素[allowed [0] .first-roadroad,allowed [0] .fourth-crossroad,allowed [0] .second-crossroad,allowed [0] .third-crossroad,allowed [1] .first-crossroad,允许[1]。第四十字路口,允许[1]。第二交叉,允许[1]。第三十字路口,允许[2]。第一十字路口,允许[2]。第四十字路口,允许[2]。第二个十字路口,允许的[2]。第三个十字路口)没有约束。

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

您尝试过使用Java ResourceBundle库吗?

例如:

<NativeSelect
    value={person}
    className={classes.margin}
    onChange={handleChangeSelect}
    input={<BootstrapInput name="person" id="person-customized-native-simple"/>}
    disabled
>
    <option value=""/>
    <option value={10}>Peter</option>
    <option value={20}>Alex</option>
    <option value={30}>Jon</option>
</NativeSelect>

之后,您可以像这样使用configApp:

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

您能尝试一下并告诉我如何吗?

编辑:

如果您打算使用ResourceBundle,则配置文件中的数据应如下所示:

configApp.getString("first-crossroad");

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

然后您这样称呼它:

configApp.getObject(“ allowed”);

将像这样存储它:

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]

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

答案 2 :(得分:1)

(众多)之一:

  • 添加:@NoArgsConstructor

到Java类:

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

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

说明:

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

无论如何,“ @ Daniel V”的任何解决方案都是正确的,并对此表示感谢!

答案 3 :(得分:1)

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