1. 程式人生 > >@Value() 設定預設值後,配置值無法生效的一個解決方法。騷操作

@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,並且當值等於引數名時當成時預設值。

如果有啥更好的方法歡迎分享!