在使用 springboot 开发时,例如你需要注入一个 url 白名单列表,你可能第一想到的写法是下面这样的:
application.yml
white.url-list:
- /test/show1
- /test/show2
- /test/show3
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
@Value("${white.url-list}")
private List<String> whileUrlList;
@GetMapping("/show1")
public Mono<String> show1(){
log.info("whileUrlList={}", whileUrlList);
return Mono.just("OK");
}
}
然而,我们天真的以为,这样是没有问题的,实际不然,这是一种错误的行为
,本文截稿时 Spring 还是不支持直接使用 @Value 的方式注入集合的。
这种需求查看了官网ISSUE,从2014年(甚至更早)就被很多人提出,很遗憾的是官方至今没有对这种注入方式进行支持。
那么我们如何注入集合呢,这里我们需要使用 @ConfigurationProperties
的方式来达到目的,具体的代码如下:
1、添加依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
2、application.yml 配置文件
white:
url-list:
- /test/show1
- /test/show2
- /test/show3
name-map:
n1: tom
n2: lily
01: Mary
3、创建对应的Java对象
@Data
@Component
@ConfigurationProperties(prefix = "white")
public class WhiteUrlProperties {
private List<String> urlList;
private Map<String, String> nameMap;
}
4、注入Java对象使用
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private WhiteUrlProperties whileUrlList;
@GetMapping("/show1")
public Mono<String> show1(){
log.info("whileUrlList={}", whileUrlList.getUrlList());
log.info("nameMap={}", whileUrlList.getNameMap());
return Mono.just("OK");
}
}
如果实在不想单独出来一个Java类,你直接把 @ConfigurationProperties
添加到你的 Service、Controller 等 SpringBean
的 Java 类上也是可以的,但是要注意一定要有对应的 set 方法(否则失败)
,如下代码所示:
@Slf4j
@RestController
@RequestMapping("/test")
@ConfigurationProperties("white")
public class TestController {
private List<String> urlList;
private Map<String, String> nameMap;
@GetMapping("/show1")
public Mono<String> show1(){
log.info("whileUrlList={}", urlList);
log.info("nameMap={}", nameMap);
return Mono.just("OK");
}
public void setUrlList(List<String> urlList) {
this.urlList = urlList;
}
public void setNameMap(Map<String, String> nameMap) {
this.nameMap = nameMap;
}
}
注意:如果map的key是0开头的,在自动注入map后,前面的0会被自动去除,这个要特别注意,你可以使用
单引号或者双引号
来将key包括起来,来避免0被去除的问题。
(END)