@Value() 設定預設值後,配置值無法生效的一個解決方法。騷操作
遇到的現象:
使用@Value(${cash.trade.show.loan.repay:true})配置後,即使配置檔案裡配置了cash.trade.show.loan.repay = false ,程式獲得的showLoanRepay還是true。
這邊原始碼會去匹配":"獲得後面的值,然後給propVal賦值,由於後面的判斷都是依照if(propVal==null)進行判斷的,所以預設值賦值上去之後就不會獲取配置檔案的值了。這個是PropertyPlaceholderConfigurer的問題,如果是
由於方法列表裡放有兩個方法,PropertyPlaceholderConfigurer先操作,所以預設值賦值後導致後面的PropertySourcesPlaceholderConfigurer無法獲取到配置項裡的內容,如果列表順序換一下,就可以了,但是沒找到怎麼弄。
這邊就是按順序方法執行進行匹配引數
-----------------------------------------------------------以下是解決方法,和解決理由------------------------------------------------------------
所以打算換個思路,不設定預設值,並且讓系統在沒有獲取到預設值時也不報錯。
進入原始碼發現,如果沒有配置時會根據下面這個引數進行判斷是否丟擲異常
而前一張圖裡發現PropertyPlaceholderConfigurer的值為true,PropertySourcesPlaceholderConfigurer的值為false,所以我們需要把PropertySourcesPlaceholderConfigurer的值配置成true這樣兩個工具都不會進行拋錯了。
只需要在spring的xml配置中加以下程式碼對 進行設定
<bean id="propertySourcesPlaceholderConfigurer" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders" value="true"/>
</bean>
但是這裡要注意了,如果你預設的引數設定成String以外的就會報錯哦,我這邊就是設定成Boolean。
這裡發現,如果你沒有進行配置,並且設定忽略沒配置時,value值會被設為${}裡面的引數名稱,所以會丟擲型別異常,所以我把引數設定成了String,並且當值等於引數名時當成時預設值。
如果有啥更好的方法歡迎分享!