springboot从application.properties中注入list, map方式
作者:uweii 发布时间:2023-11-28 23:42:33
需求
在配置类中,从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真是让我们把重心放在开发功能上而不是繁琐的配置文件上。
最后,不知道有没有解决到同样遇到配置问题注入的你,自己慢慢发现其中的问题对于理解新鲜事物有着很大的帮助,戒骄戒躁。
来源:https://blog.csdn.net/dummyo/article/details/102495784
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 前言最近在工作中需要编译android下的动态库,本以为是一件简单的事,没想到因为工具,以及google本身被墙的原因,折腾了好久。在win
- FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件
- 最近做的项目,需要将一些信息导出到word中。在网上找了好多解决方案,现在将这几天的总结分享一下。目前来看,java导出word大致有6种解
- 其他的不多说了!我们来看看效果吧 一、实现方式一:直接引入compile方式A
- 概述非对称加密算法与对称加密算法的主要差别在于非对称加密算法用于加密和解密的密钥不相同,非对称加密算法密钥分为公钥和私钥,公钥加密只能用私钥
- 代码入下:import java.io.*; public class Practice { publ
- 编码&解码 通过下图我们可以了解在javaWeb中有哪些地方有转码:用户想服务器发送一个HTTP请求,需要编码的地方有ur
- 本文实例讲述了Android之复选框对话框用法。分享给大家供大家参考。具体如下:main.xml布局文件<?xml version=&
- 虽然说模块通信、路由协议在Android已经不新鲜了,但是如果脱离了那些优秀的开源库我们从零开始自己造一个库,有时候重复造轮子会让自己对所谓
- 接触FFmpeg有一段时间了,它是音视频开发的开源库,几乎其他所有播放器、直播平台都基于FFmpeg进行二次开发。本篇文章来总结下采用FFm
- 由于我们在eclipse ee中把项目部署在web端经常会出现报404错误。原因为:404状态码是一种http状态码,其意思是: 所请求的页
- WebService是一种跨编程语言和跨操作系统平台的远程调用技术所谓远程调用,就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一
- 前言回老家,实在太无聊,于是乎给自己整了一套台式机配置,总价 1W+,本以为机器到位后可以打打游戏,学学技术打发无聊的时光。但是我早已不是从
- C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,和time()函数。需要说明的是,iostream头文件
- 最新开发新项目的时候,要做分享项目,要求分享有微信,微信朋友圈,QQ,QQ空间,新浪微博这五个,所分享内容包括,分享纯图片,纯文字,图文类型
- 当你在开发flutter应用的时候,有时会需要调用native的api,往往遇到flutter并没有相应的package, 这时候flutt
- 一、ServletConfig讲解1.1、配置Servlet初始化参数在Servlet的配置文件web.xml中,可以使用一个或多个<
- 在 Flutter 中使用图片是最基础能力之一。作为春节开工后的第一篇文章,17 做了精心准备,满满的都是干货!本文介绍如何在 Flutte
- 这篇文章主要介绍了Java实现TCP/IP协议的收发数据(服务端)代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参
- EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。ehcach