springboot從application.properties中注入list,?map方式
需求
在配置類中,從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()); } }
運行結(jié)果:
application.properties配置注入出現(xiàn)錯誤
配置list,map(list內(nèi)含對象)多層嵌套問題,注入對象失敗,無法加載到配置文件
繼SpringBoot使用@Value無法賦值之后,kimball又遇到一個application.properties配置注入問題,可能作為新手,這里該踩得坑都掉下去了~真是一踩一個準。
問題描述
application.properties配置注入出現(xiàn)錯誤,配置list,map(list內(nèi)含對象)多層嵌套問題,注入對象失敗,無法加載到配置文件。后詢問多方大神,仍無法加載,那么自己慢慢測試吧。
我的目錄結(jié)構(gòu)是這樣:對象建立了postinfolist>postinfo>header三層結(jié)構(gòu),header內(nèi)含Map鍵值對,postinfolist是postinfo的List集合,故也算是個多層嵌套的格式。一開始我的配置如下:
大概情況應(yīng)該是描述清楚了吧,下面我們來分析沒有加載到配置文件的錯誤原因及分析方法。
作為freshman,我只是一步步驗證,既然加載不到這么多層,那么我從最低層header驗證,單獨配置了下header,header.headerMap.AppKey=xxx(header prefix注意修改),結(jié)果加載到了,那么好,說明不是配置文件加載啊或是引入啊什么的問題,應(yīng)該是多層嵌套自己寫的有誤。
那么第二步,往上一層,配置postinfo.header.headerMap.AppKey=xxx(prefix對應(yīng)修改,不在多說),又加載到了,那么可以知道問題所在了,配置postinfolist時,List這塊兒配置的不正確。這樣一步步排查,我們可以找到問題所在,所以有問題,先想排查方法,找到問題所在就可以迎刃而解,本質(zhì)有點像方法論~
那么再回看這個配置文件,此時對application.properties的配置也有點領(lǐng)悟了,實際上就是 自上而下的表達出你要注入的參數(shù),也就是我的上層postinfolist(Springboot幫我們注入時先找這個最上級),而后一點一點往后去找對應(yīng)關(guān)系,也就是先找到對象內(nèi)的postinfolist這個List集合,即對象的成員變量,那么配置我們就可以寫postinfolist.postinfolist獲得了List集合,而后要表達集合里的postinfo,postinfolist.postinfolist[0],即相當于list.get(0),這么來看是不是很容易理解application的配置文件寫法了,而后再逐層表示到你要注入的參數(shù)即可,也就是postinfolist.postinfolist[0].header.headerMap.AppKey,之前的寫法只是覺得是對應(yīng)上prefix的前綴就可以讀到了,而其實Springboot為我們做的更多,將你寫的對象通過一步步層級關(guān)系來分析注入,也算是新人對Springboot的一點敬仰吧,之前接觸過一段ssh,那是一段痛苦的歷程,很多東西要自己配置,而springboot真是讓我們把重心放在開發(fā)功能上而不是繁瑣的配置文件上。
最后,不知道有沒有解決到同樣遇到配置問題注入的你,自己慢慢發(fā)現(xiàn)其中的問題對于理解新鮮事物有著很大的幫助,戒驕戒躁。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- 使用springboot logback動態(tài)獲取application的配置項
- springboot logback如何從apollo配置中心讀取變量
- SpringBoot項目的logback日志配置(包括打印mybatis的sql語句)
- SpringBoot配置lombok與logback過程解析
- SpringBoot中讀取application.properties配置文件的方法
- 關(guān)于SpringBoot配置文件application.properties的路徑問題
- springboot application.properties 文件注入數(shù)組方式
- 解決SpringBoot加載application.properties配置文件的坑
- 淺析Spring boot 中 logback 配置<springProperty> 讀取application.properties 中的屬性
相關(guān)文章
CMD運行Intellij Idea編譯后的class文件操作
這篇文章主要介紹了CMD運行Intellij Idea編譯后的class文件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02基于Servlet實現(xiàn)技術(shù)問答網(wǎng)站系統(tǒng)
這篇文章主要為大家詳細介紹了基于Servlet實現(xiàn)技術(shù)問答網(wǎng)站系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04Java實戰(zhàn)之OutOfMemoryError異常問題及解決方法
這篇文章主要介紹了Java實戰(zhàn)之OutOfMemoryError異常,主要結(jié)合著深入理解Java虛擬機一書當中整理了本篇內(nèi)容,感興趣的朋友一起看看吧2022-04-04Springboot整合ActiveMQ實現(xiàn)消息隊列的過程淺析
昨天仔細研究了activeMQ消息隊列,也遇到了些坑,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合ActiveMQ的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-02-02Spring Boot + Thymeleaf + Activiti 快速開發(fā)平臺項目 附源碼
這篇文章主要介紹了Spring Boot + Thymeleaf + Activiti 快速開發(fā)平臺項目附源碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04