1. 程式人生 > 其它 >Could not resolve placeholder ‘xxx‘ in value “${xxx}“

Could not resolve placeholder ‘xxx‘ in value “${xxx}“

問題
今天用idea啟動springboot的時候發現某個配置沒找到
報錯: Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder ‘project.url’ in value “${project.url}”

解決過程/思路(不想看思路的直接跳解決方案)
首先,我檢查了的所有的配置檔案,確定沒有問題
然後檢視日誌,確定是開發環境,需要的配置在檔案中都配了
再然後根據日誌找到報錯的地點
PropertyPlaceholderHelper中的parseStringValue方法,如圖

 

 

 

查詢附近程式碼,發現是因為propVal為null才報錯的

 

 

 

然後從propVal定義的地方開始debugger
發現placeholderResolver.resolvePlaceholder(placeholder);是獲取${xxx}中 xxx 的屬性,ctrl+u 執行程式碼
將placeholder替換為其他的屬性字串,發現有些配置的值確實沒取到,像是玄學問題:明明所有的配置都寫的好好的
但是,所有的玄學問題都是因為不瞭解才導致的,找不到原因只是因為自己不熟悉
開始思考原因

 

 

 眾所周知,程式碼執行的目錄是專案編譯後的目錄,而不是原始碼所在的目錄,然後就去找編譯後的目錄中的配置
這個目錄springboot的日誌其實已經輸出來瞭如圖:

 

 

 果然,發現編譯後的目錄中少了配置

 

 

 

找到原因就好辦了,使用maven clear 將生成的檔案清空,然後再啟動
問題解決!!

解決方案

    1. 檢查配置檔案中的配置有沒有寫錯
    2. 檢查application.yml/bootstrap.yml 配置檔案中的active是否配對,或者看日誌中的這條日誌,然後檢查對應的日誌檔案
      1. 如果上述操作檢查之後都沒問題,檢查target目錄(或者自己配的class檔案輸出目錄)下的配置檔案對不對,如果不對 使用maven clear命令清除這些檔案,重新啟動
      2. 如果還不行,那就只能在原始碼中debugger了

      

結語
所有的玄學問題都是因為我們對它們不夠熟悉,所有的bug必然會有一個或多個原因,如果認為它是一個玄學問題,那隻能說,我們對這個事物不夠熟悉,而不是因為玄學,計算機行業更是如此,讓我們的程式碼中沒有玄學

寫這篇文章的時候想起了我初入行的時候,不會debug,也不知道如何解決bug,將好多問題歸咎於玄學,經常在不知道為什麼產生bug的時候使用重啟大法,有時有用有時沒用,可能就是缺少一些這樣的方法論