我有一个动态应用程序.yml文件,我想使用嵌套列表和映射。
我知道它开箱即用,但也许有人找到了解决方案。
我的目标是我可以定义这样的东西:
user:
test:
- peter
- willi
test2:
- helloA: abc
helloA2: def
- helloB: 123
helloB2: 345
-
@Value("${user.test}")
private String[] names;
@Value("${user.test2}")
private List<Map> test;
这并不简单。假设下面是您想要的配置:
user:
test:
-
name: johndoe
email: john@doe.com
-
name: jackdoe
email: jackdoe
接下来,您必须创建一个配置类
@ConfigurationProperties(prefix = "myconfig")
public class MyConfig {
private List<User> users;
public MyConfig() {
}
public MyConfig(List<User> users) {
this.users = users;
}
public void setUsers(List<User> users) {
this.users = users;
}
public List<User> getUsers() {
return users;
}
public static class User {
private String name;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
}
然后在适当的地方使用它
@Configuration
@EnableConfigurationProperties(User.class)
public class ClassThatNeedsUser{
@Autowired
private User user;
private Map usersMap = new HashMap();
@Bean
public ClassThatNeedsUser getUserList(){
for(User user: user.getUsers()) {
usersMap.put(user.getName(), user.getEmail());
}
}
}
我认为
,您可以根据需要进行扩展,但这适用于我的代码(Spring Boot),尽管它不是列表而是数组。此外,我需要一个不需要特定配置 Java 类的解决方案,因为大多数旧答案都是关于创建属性配置类的。
my-map-property-name: "{
KEY1: "[VALUE1,VALUE2]",
KEY2: "[VALUE3]" }"
@Value("#{${my-map-property-name}}")
private Map<String, String[]> myMap;
我测试了它,您也可以将枚举值用于映射键和值。
三件事,
- 它是 json 格式
- 它是一个多行 json
- 值部分用双引号
参考 SO 答案
另外,要从字符串中的分隔符分隔值中获取列表,可以调用拆分方法,
@Value("#{'${my.property:def_val}'.split(',')}")
private List<String> myValues;
其中def_val
是属性的默认值。