springboot从application.properties中注入list, map方式

目录
  • 需求
  • 直接上代码
    • 配置类
    • 测试类
  • application.properties配置注入出现错误
    • 问题描述

需求

在配置类中,从application.properties中读取一个复杂list。如List<Person>或者初始化一个map

直接上代码

配置类

@Configuration
@Component
@ConfigurationProperties(prefix = "datahub")
public class Config {
    private List<DatahubParam> datahubParams;
    private Map<String, Object> map;
    public void setMap(Map<String, Object> map) {
        this.map = map;
    }

    public Map<String, Object> getMap() {
        return map;
    }

    public List<DatahubParam> getDatahubParams() {
        return datahubParams;
    }

    public void setDatahubParams(List<DatahubParam> datahubParams) {
        this.datahubParams = datahubParams;
    }
}

DatahubParam.java:

public class DatahubParam {
    private String project;
    private String topic;
    private String subId;
    private String shardId;

    @Override
    public String toString() {
        return "{project: " + project + ", topic: " + topic + ", subId: " + subId + ", shardId: " + shardId + "}";
    }

    public String getProject() {
        return project;
    }

    public void setProject(String project) {
        this.project = project;
    }

    public String getTopic() {
        return topic;
    }

    public void setTopic(String topic) {
        this.topic = topic;
    }

    public String getSubId() {
        return subId;
    }

    public void setSubId(String subId) {
        this.subId = subId;
    }

    public String getShardId() {
        return shardId;
    }

    public void setShardId(String shardId) {
        this.shardId = shardId;
    }
}

application.properties:

datahub.datahub-params[0].project = project-0
datahub.datahub-params[0].topic = topic-0
datahub.datahub-params[0].sub-id = subId-0
datahub.datahub-params[0].shard-id = shardId-0

datahub.datahub-params[1].project = project-1
datahub.datahub-params[1].topic = topic-1
datahub.datahub-params[1].sub-id = subId-1
datahub.datahub-params[1].shard-id = shardId-1

datahub.map.username=uwei
datahub.map.age=22
datahub.map.salary=15000

测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloTest {
    @Autowired
    Config config;

    @Test
    public void test(){
        System.out.println(config.getDatahubParams());
        System.out.println(config.getMap());
    }
}

运行结果:

application.properties配置注入出现错误

配置list,map(list内含对象)多层嵌套问题,注入对象失败,无法加载到配置文件

继SpringBoot使用@Value无法赋值之后,kimball又遇到一个application.properties配置注入问题,可能作为新手,这里该踩得坑都掉下去了~真是一踩一个准。

问题描述

application.properties配置注入出现错误,配置list,map(list内含对象)多层嵌套问题,注入对象失败,无法加载到配置文件。后询问多方大神,仍无法加载,那么自己慢慢测试吧。

我的目录结构是这样:对象建立了postinfolist>postinfo>header三层结构,header内含Map键值对,postinfolist是postinfo的List集合,故也算是个多层嵌套的格式。一开始我的配置如下:

大概情况应该是描述清楚了吧,下面我们来分析没有加载到配置文件的错误原因及分析方法。

作为freshman,我只是一步步验证,既然加载不到这么多层,那么我从最低层header验证,单独配置了下header,header.headerMap.AppKey=xxx(header prefix注意修改),结果加载到了,那么好,说明不是配置文件加载啊或是引入啊什么的问题,应该是多层嵌套自己写的有误。

那么第二步,往上一层,配置postinfo.header.headerMap.AppKey=xxx(prefix对应修改,不在多说),又加载到了,那么可以知道问题所在了,配置postinfolist时,List这块儿配置的不正确。这样一步步排查,我们可以找到问题所在,所以有问题,先想排查方法,找到问题所在就可以迎刃而解,本质有点像方法论~

那么再回看这个配置文件,此时对application.properties的配置也有点领悟了,实际上就是 自上而下的表达出你要注入的参数,也就是我的上层postinfolist(Springboot帮我们注入时先找这个最上级),而后一点一点往后去找对应关系,也就是先找到对象内的postinfolist这个List集合,即对象的成员变量,那么配置我们就可以写postinfolist.postinfolist获得了List集合,而后要表达集合里的postinfo,postinfolist.postinfolist[0],即相当于list.get(0),这么来看是不是很容易理解application的配置文件写法了,而后再逐层表示到你要注入的参数即可,也就是postinfolist.postinfolist[0].header.headerMap.AppKey,之前的写法只是觉得是对应上prefix的前缀就可以读到了,而其实Springboot为我们做的更多,将你写的对象通过一步步层级关系来分析注入,也算是新人对Springboot的一点敬仰吧,之前接触过一段ssh,那是一段痛苦的历程,很多东西要自己配置,而springboot真是让我们把重心放在开发功能上而不是繁琐的配置文件上。

最后,不知道有没有解决到同样遇到配置问题注入的你,自己慢慢发现其中的问题对于理解新鲜事物有着很大的帮助,戒骄戒躁。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • @ConfigurationProperties绑定配置信息至Array、List、Map、Bean的实现

    相关说明: 在SpringBoot中,我们可以通过以下几种方式获取并绑定配置文件中的信息: @Value注解. 使用Environment. @ConfigurationProperties注解. 通过实现ApplicationListener接口,注册监听器,进行硬编码获取,可参考:https://www.jb51.net/article/187407.htm 硬编码加载文件获取. -- 注:一般情况下,第一种.第二种就够用了;但是如果想直接从配置文件中获取到数组.list.map.对象的话,

  • 在SpringBoot下读取自定义properties配置文件的方法

    SpringBoot工程默认读取application.properties配置文件.如果需要自定义properties文件,如何读取呢? 一.在resource中新建.properties文件 在resource目录下新建一个config文件夹,然后新建一个.properties文件放在该文件夹下.如图remote.properties所示 二.编写配置文件 remote.uploadFilesUrl=/resource/files/ remote.uploadPicUrl=/resource

  • 使用SpringBoot 工厂模式自动注入到Map

    目录 SpringBoot 工厂模式自动注入Map 一.建立工厂类 二.两个实现类 三.注入到map里,测试 SpringBoot自动注入原理 一.自动配置原理 二.细节 SpringBoot 工厂模式自动注入Map 一.建立工厂类 public interface AnimalFactory { String food(); String animal(); } 二.两个实现类 @Service public class Cat implements AnimalFactory { @Over

  • Spring 配置文件字段注入到List、Map

    今天给大家分享冷门但是有很实小知识,Spring 配置文件注入list.map.字节流. list 注入 properties文件 user.id=3242,2323,1 使用spring el表达式 @Value("#{'${user.id}'.split(',')}") private List list; yaml 文件 在yml配置文件配置数组方式 number: arrays: - One - Two - Three @Value("${number.arrays}

  • springboot从application.properties中注入list, map方式

    目录 需求 直接上代码 配置类 测试类 application.properties配置注入出现错误 问题描述 需求 在配置类中,从application.properties中读取一个复杂list.如List<Person>或者初始化一个map 直接上代码 配置类 @Configuration @Component @ConfigurationProperties(prefix = "datahub") public class Config { private List

  • SpringBoot如何获取application.properties中自定义的值

    目录结构: pom文件: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/

  • springboot application.properties 文件注入数组方式

    目录 application.properties 文件注入数组 在application.properties中注入value,list和map 配置文件 注解 数据注入 application.properties 文件注入数组 1.application.properties ips=192.168.0.105,192.168.0.106,0:0:0:0:0:0:0:1 2.代码 @Value("#{'${ips}'.split(',')}") private List<S

  • 在SpringBoot 中从application.yml中获取自定义常量方式

    要注意的地方是 application.yml 中不能用驼峰式写法(systemParams)要改成system-params 方法一: 引入依赖: <!-- 支持 @ConfigurationProperties 注解 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</a

  • 关于SpringBoot获取IOC容器中注入的Bean(推荐)

    一: 注入一个TestUtils类 package com.shop.sell.Utils; import com.shop.sell.dto.CartDTO; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TestUtils { @Bean(name="test

  • springboot如何读取自定义properties并注入到bean中

    目录 读取自定义properties注入到bean springboot启动日志如下 springboot bean实例化和属性注入过程 springboot版本(2.0.4 RELEASE) Bean的实例化 Bean的属性注入 读取自定义properties注入到bean 在使用springboot项目时,可使用@value的方式直接读取application.properties中的文件,但有时我们需要配置自定义的properties,下面方法将在springboot启动时利用filein

  • 深入理解springboot中配置文件application.properties

    目录 前言 正文 自定义属性 参数间引用 使用自定义配置文件 随机值配置 外部配置-命令行参数配置 配置文件的优先级 Profile-多环境配置 总结 前言 Spring Boot使用"习惯优于配置"(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速运行起来.所以,我们要想把Spring Boot玩的溜,就要懂得如何开启各个功能模块的默认配置,这就需要了解Spring Boot的配置文件application.properties. 正文

  • Spring Boot中配置文件application.properties使用

    一.配置文档配置项的调用 启动后在浏览器直接输入http://localhost:18080/user/test,就直接打印出配置文件中的配置内容. 二.绑定对象bean调用 有时候属性太多了,一个个绑定到属性字段上太累,官方提倡绑定一个对象的bean,这里我们建一个ConfigBean.java类,顶部需要使用注解@ConfigurationProperties(prefix = "com")来指明使用哪个 @ConfigurationProperties(prefix = &quo

  • SpringBoot如何读取配置文件中的数据到map和list

    目录 读取配置文件中的数据到map和list springboot读取配置文件中的配置信息到map springboot读取配置文件中的配置信息到list 测试上述配置是否有效 配置文件的读取(包括list.map类型) 读取配置文件 第一种方式 第二种方式 扩展 读取配置文件中的数据到map和list 之前使用过@Value("${name}")来读取springboot配置文件中的配置信息,比如: @Value("${server.port}") private

  • SpringBoot之@Value获取application.properties配置无效的解决

    目录 @Value获取application.properties配置无效问题 @Value获取application.properties中的配置取值为Null 解决方法 正确做法 总结 @Value获取application.properties配置无效问题 无效的原因主要是要注意@Value使用的注意事项: 1.不能作用于静态变量(static): 2.不能作用于常量(final); 3.不能在非注册的类中使用(需使用@Componet.@Configuration等): 4.使用有这个属

随机推荐