springboot 注入配置文件中的集合 List

在使用 springboot 开发时,例如你需要注入一个 url 白名单列表,你可能第一想到的写法是下面这样的:

application.yml

yml 复制代码
white.url-list:
  - /test/show1
  - /test/show2
  - /test/show3
java 复制代码
@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、添加依赖

xml 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

2、application.yml 配置文件

yml 复制代码
white.url-list:
  - /test/show1
  - /test/show2
  - /test/show3

3、创建对应的Java对象

java 复制代码
@Data
@Component
@ConfigurationProperties(prefix = "white")
public class WhiteUrlProperties {

    private List<String> urlList;

}

4、注入Java对象使用

java 复制代码
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    private WhiteUrlProperties whileUrlList;

    @GetMapping("/show1")
    public Mono<String> show1(){
        log.info("whileUrlList={}", whileUrlList.getUrlList());
        return Mono.just("OK");
    }

}

如果实在不想单独出来一个Java类,你直接把 @ConfigurationProperties 添加到你的 Service、Controller 等 SpringBean 的 Java 类上也是可以的,但是要注意一定要有对应的 set 方法(否则失败),如下代码所示:

java 复制代码
@Slf4j
@RestController
@RequestMapping("/test")
@ConfigurationProperties("white")
public class TestController {

    private List<String> urlList;

    @GetMapping("/show1")
    public Mono<String> show1(){
        log.info("whileUrlList={}", urlList);
        return Mono.just("OK");
    }

    public void setUrlList(List<String> urlList) {
        this.urlList = urlList;
    }
}

(END)

相关推荐
前路不黑暗@1 分钟前
Java项目:Java脚手架项目的统一模块的封装(四)
java·开发语言·spring boot·笔记·学习·spring cloud·maven
高山上有一只小老虎1 小时前
SpringBoot项目单元测试
spring boot·后端·单元测试
❀͜͡傀儡师2 小时前
Spring Boot Pf4j模块化能力设计思考
运维·spring boot·后端·pf4j
前路不黑暗@2 小时前
Java项目:Java脚手架项目的通用组件的封装(五)
java·开发语言·spring boot·学习·spring cloud·bootstrap·maven
❀͜͡傀儡师3 小时前
基于mybatis-plus进行加解密 Spring Boot Starter
spring boot·oracle·mybatis
星空彼岸0074 小时前
SA-Token在SpringBoot中的实战指南
java·spring boot·后端
闻哥4 小时前
ConcurrentHashMap 1.7 源码深度解析:分段锁的设计与实现
java·开发语言·jvm·spring boot·面试·jdk·hash
哈库纳玛塔塔4 小时前
dbVisitor 统一数据库访问库,更新 v6.7.0,面向 AI 支持向量操作
数据库·spring boot·orm
一 乐6 小时前
林业资源管理|基于java + vue林业资源管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·林业资源管理系统
前路不黑暗@7 小时前
Java项目:Java脚手架项目的模板服务和网关服务的实现(三)
java·开发语言·spring boot·git·学习·spring cloud·maven