@Value如何设置默认值
作者:有梦想的攻城狮
@Value设置默认值
使用@Value注解将变量进行自动注入的时候,经常会出现的一个问题就是我们可能会由于在配置参数中忘记设置该参数造成整个项目报错,其实我们可以通过给被@Value注解作用的变量进行注入的时候如果没有找到该配置参数时设置一个默认值,相当于是一个兜底的方案:
没有默认值的用法:
@Value("${spring.port}") private String port;
增加默认值的用法:
@Value("${spring.port:8080}") private String port;
这里需要注意的是:
- 即使你的配置参数的值是String类型的话也不需要加双引号
- 被static修饰的变量通过@Value会注入失败
如果是因为特定需求必须要给static变量进行@Value设值的话,可以采用下面这种方式
- 给static变量采用@Value设值
public static String port; @Value("${spring.port:8080}") public void setPort(String port){ Class.port = port; }
@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,并且当值等于参数名时当成时默认值。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。