@Value() 设置默认值后,配置值无法生效的一个解决方法。骚操作

版权声明:本文为博主原创文章,未经博主允许也可转载,但要注明出处哦。 https://blog.csdn.net/hx765287443/article/details/84062637

遇到的现象:

使用@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,并且当值等于参数名时当成时默认值。

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

猜你喜欢

转载自blog.csdn.net/hx765287443/article/details/84062637