• 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)

  • 相关阅读:
    第二十九章 管理许可(二)
    使用 SAP WebIDE 将 SAP UI5 应用部署到 ABAP 系统时遇到的关于传输请求的错误
    Springboot毕设项目办公物资管理系统6304w(java+VUE+Mybatis+Maven+Mysql)
    C语言从入门到入土——操作符超详细总结
    面向对象-01我的世界
    100天精通Python(数据分析篇)——第50天:numpy进阶
    微服务:Eureka原理实践:@EnableEurekaServer、@LoadBalanced
    python elasticsearch更新延迟问题
    IIC总线专题超级全
    【初识Linux】上
  • 原文地址:https://blog.csdn.net/catoop/article/details/134180178