spring boot 中使用 @value 能自动注入属性值简化了很多操作,但是注入 Map 类型时却不行。
使用 @ConfigurationProperties 的方式可以实现,但是增加了一点复杂度。
Map 值设置成 json 字符串也能实现,但是减低了可读性。
请问有什么办法能够让 @value 也能注入 Map?
期望如下方式
@Value("${my.map}")
private Map map;
但是报错提示 Could not resolve placeholder 'my.map' in value "${my.map}"
application-dev.yml
my:
string: string_value
map:
name: name_value
age: age_value
Application
@SpringBootApplication
public class Application extends SpringBootServletInitializer implements ApplicationRunner {
@Autowired
private MyMap myMap;
@Value("${my.string}")
private String stringValue;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(stringValue);
System.out.println(myMap);
}
}
回答
my:
string: string_value
map:
name: name_value
age: age_value
这个方式编写my.map中map必须是一个对象,如果你需要想这样获取Map的话,
正确写法
@Value("${my.map}")
private Map map;
yml文件
my:
map:{name: name_value, age: age_value}
但是其实这样写非常不友好哦
有一种更加优美的写法:
创建一个类:
public class User{
private String name;
private int age;
//add get setter
}
在该类上加入如上注解:
@Component
@ConfigurationProperties(prefix = "my.map")
yml写法:
my:
string: string_value
map:
name: name_value
age: age_value
@value 好像注入不了map,
必须用@ConfigurationProperties,这种