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


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

    application.yml

    white.url-list:
      - /test/show1
      - /test/show2
      - /test/show3
    
    • 1
    • 2
    • 3
    • 4
    @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");
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    然而,我们天真的以为,这样是没有问题的,实际不然,这是一种错误的行为,本文截稿时 Spring 还是不支持直接使用 @Value 的方式注入集合的。
    这种需求查看了官网ISSUE,从2014年(甚至更早)就被很多人提出,很遗憾的是官方至今没有对这种注入方式进行支持。

    那么我们如何注入集合呢,这里我们需要使用 @ConfigurationProperties 的方式来达到目的,具体的代码如下:

    1、添加依赖

            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-configuration-processorartifactId>
                <optional>trueoptional>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、application.yml 配置文件

    white:
      url-list:
        - /test/show1
        - /test/show2
        - /test/show3
      name-map:
        n1: tom
        n2: lily
        01: Mary
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3、创建对应的Java对象

    @Data
    @Component
    @ConfigurationProperties(prefix = "white")
    public class WhiteUrlProperties {
    
        private List<String> urlList;
    
        private Map<String, String> nameMap;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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");
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    如果实在不想单独出来一个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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    注意:如果map的key是0开头的,在自动注入map后,前面的0会被自动去除,这个要特别注意,你可以使用单引号或者双引号来将key包括起来,来避免0被去除的问题。


    (END)

  • 相关阅读:
    apk反编译工具下载
    k8s-身份认证与权限
    Centos部署openGauss6.0创新版本,丝滑的体验
    CVE-2021-44228 Apache Log4j2远程代码执行漏洞复现
    ETL工具-nifi干货系列 第十六讲 nifi Process Group实战教程,一文轻松搞定
    多御安全浏览器宝藏功能全新升级,建议低调使用
    MySQL 事务隔离级别和MVCC版本控制
    算法竞赛入门【码蹄集新手村600题】(MT1201-1250)
    [数据集][目标检测]城市道路垃圾检测数据集5266张33类别重制版
    navigator.geolocation.getCurrentPosition在谷歌浏览器不执行的问题
  • 原文地址:https://blog.csdn.net/catoop/article/details/134180178