原因:元素未绑定

Old*_*eer 1 java configuration spring-boot

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

我已经尝试了几个来源:

配置属性在弹簧引导

spring-boot-configurationproperties-example

SpringBoot 2 元素未绑定

堆栈: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
Run Code Online (Sandbox Code Playgroud)

用于数据加载的 Java 类是:

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
Run Code Online (Sandbox Code Playgroud)

Java CrossroadCombination 对象定义:

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

  private List<CrossroadCombination> allowed;
}

Run Code Online (Sandbox Code Playgroud)

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

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.
Run Code Online (Sandbox Code Playgroud)

Old*_*eer 11

(众多之一)解决方案:

  • 添加:@NoArgsConstructor

到java类:

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

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

Run Code Online (Sandbox Code Playgroud)

解释:

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

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


小智 6

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

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)