春季使用带有@VALUE的 YAML 中的列表和地图



我有一个动态应用程序.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;

我测试了它,您也可以将枚举值用于映射键和值。

三件事,

  1. 它是 json 格式
  2. 它是一个多行 json
  3. 值部分用双引号

参考 SO 答案

另外,要从字符串中的分隔符分隔值中获取列表,可以调用拆分方法,

@Value("#{'${my.property:def_val}'.split(',')}")
private List<String> myValues;

其中def_val是属性的默认值。

最新更新