原因:元素未绑定
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 解决了问题
在我的例子中,变量名不匹配。请检查所有字段名称和映射配置键名称。
如何在 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 解决了问题
在我的例子中,变量名不匹配。请检查所有字段名称和映射配置键名称。