YAML是JSON的一個超集,可以非常方便地將外部配置以層次結構形式存儲起來。作為人員來說,使用YAML文件進行配置,可以使得我們的配置看起來層次更加直觀,后期維護也比較方便,但是在使用YAML文件作為springboot的配置文件時,也時常會遇到各種坑,今天就將這些坑做一個小匯總和記錄。
1.空格上出現的坑
首先是YAML文件是按照特定語法來解析文件的,當我們的配置文件格式出現錯誤時則會解析失敗,而做容易出錯的莫過於配置的鍵值對在冒號后還需要一個空格才能正常解析,如:
在port:之后我們需要加上一個空格,然后在跟上我們的端口號3090,而且還有一種比較特殊的情況,在YAML文件中有兩種空格是不一樣的,一種是我們鍵盤輸入的空格(ASCII值是32),還有一種是不間斷空格(non-breaking space,ASCII值是160),但我們在冒號后加的空格是不間斷空格時,文件是不能被正常解析的,當然這坑不常見,一般只有在網頁直接復制的配置才可能出現這總情況。
2. 不允許出現一樣的同級屬性
在YAML文件中是不允許出現一樣的同級屬性,就如:
其中這兩個server就是同級且同名的兩個配置,是不允許的,這個問題常常在我們的配置文件比較長比較復雜時出現
3. Springboot中使用@Value注入屬性報錯
在代碼中使用@Value讀取配置文件中的配置並注入是非常方便的,但是@Value卻有他的局限性,@Value只能注入一些簡單數據結構的數據,當我們需要讀取配置文件中的一個數組數據並注入spring boot中時,則會報錯,如下
然后我們嘗試使用@Value注入customer-role.customerAllowMenuIds
然后就會發現程序啟動時會報java.lang.IllegalArgumentException: Could not resolve placeholder 'customer-role.customerAllowMenuIds' in value "${customer-role.customerAllowMenuIds}"的錯誤
所以一般來說,當我們需要注入List或者數組之類的數據時,大多都是@ConfigurationProperties的方式將變量注入類的屬性中。
但是如果你決意使用@Value來注入的話也可以嘗試將配置文件中配置改變一下
再使用@Value("#{'${customer-role.customerAllowMenuIds}'.split(',')}")來注入
可以看到上面我們使用了spring的表達式#{},功能還是很強大的,有興趣可以深入了解下。它同樣可以使得我們可以很方便的使用@Value注入如Map等其他的復雜結構的數據。