Spring在YAML中使用@VALUE的列表和Map

thtygnil  于 2023-05-17  发布在  Spring
关注(0)|答案(2)|浏览(257)

我有一个动态应用程序.yml文件,我想使用嵌套列表和Map。
我知道它不工作的开箱即用,但也许有人找到了解决方案。
我的目标是我可以定义这样的东西:

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;
tquggr8v

tquggr8v1#

这并不简单。让我们假设下面是您想要的配置:

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());
        }
    }

}
6ojccjat

6ojccjat2#

我认为,你可以根据你的要求扩展,但这在我的代码(Sping Boot )中工作,尽管它不是List而是数组。另外,我需要一个不需要特定配置Java类的解决方案,因为大多数旧的答案都是关于创建属性配置类的。

my-map-property-name: "{\
         KEY1: \"[VALUE1,VALUE2]\",\  
         KEY2: \"[VALUE3]\"  \ }"

@Value("#{${my-map-property-name}}")
    private Map<String, String[]> myMap;

我测试了它,你可以使用枚举值以及Map键和值。
三件事

  1. JSON格式
    1.多行JSON
    1.值部分用双引号引起来
    Reference SO Answer
    另外,要从String中的分隔符分隔值中获取List,可以调用split方法,
@Value("#{'${my.property:def_val}'.split(',')}")
private List<String> myValues;

其中def_val是属性的默认值。

相关问题