springboot从application.properties中注入list, map方式
作者:uweii
需求
在配置类中,从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真是让我们把重心放在开发功能上而不是繁琐的配置文件上。
最后,不知道有没有解决到同样遇到配置问题注入的你,自己慢慢发现其中的问题对于理解新鲜事物有着很大的帮助,戒骄戒躁。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
- 使用springboot logback动态获取application的配置项
- springboot logback如何从apollo配置中心读取变量
- SpringBoot项目的logback日志配置(包括打印mybatis的sql语句)
- SpringBoot配置lombok与logback过程解析
- SpringBoot中读取application.properties配置文件的方法
- 关于SpringBoot配置文件application.properties的路径问题
- springboot application.properties 文件注入数组方式
- 解决SpringBoot加载application.properties配置文件的坑
- 浅析Spring boot 中 logback 配置<springProperty> 读取application.properties 中的属性