@Value如何设置默认值

 更新时间:2023年07月28日 09:30:50   作者:有梦想的攻城狮  
这篇文章主要介绍了@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,并且当值等于参数名时当成时默认值。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java实现的图片裁剪功能示例

    java实现的图片裁剪功能示例

    这篇文章主要介绍了java实现的图片裁剪功能,涉及java针对图片的读取、转换、保存等相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • java基础学习JVM中GC的算法

    java基础学习JVM中GC的算法

    这篇文章主要介绍了java基础学习JVM中GC的算法,通过图文加深对GC算法思路的理解。
    2017-11-11
  • Java日期工具类DateUtils实例详解

    Java日期工具类DateUtils实例详解

    这篇文章主要为大家详细介绍了Java日期工具类DateUtils实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Java Swing SpringLayout弹性布局的实现代码

    Java Swing SpringLayout弹性布局的实现代码

    这篇文章主要介绍了Java Swing SpringLayout弹性布局的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Spring Boot 自动配置之条件注解浅析

    Spring Boot 自动配置之条件注解浅析

    这篇文章主要介绍了Spring Boot 自动配置之条件注解浅析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • BeanUtils.copyProperties在拷贝属性时忽略空值的操作

    BeanUtils.copyProperties在拷贝属性时忽略空值的操作

    这篇文章主要介绍了BeanUtils.copyProperties在拷贝属性时忽略空值的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java后台接口开发初步实战教程

    Java后台接口开发初步实战教程

    下面小编就为大家分享一篇 Java后台接口开发初步实战教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • SpringBoot利用观察者模式实现联动更新机制

    SpringBoot利用观察者模式实现联动更新机制

    观察者模式(Observer Pattern)是一种软件设计模式,在许多应用系统中,我们经常需要处理多个表之间的关联更新问题,本文将通过一个具体的案例,介绍如何在Spring Boot项目中利用观察者模式来优雅地解决这一需求,需要的朋友可以参考下
    2024-07-07
  • Java throw和throws使用区别分析

    Java throw和throws使用区别分析

    这篇文章主要介绍了Java throw和throws使用区别分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java设置Access-Control-Allow-Origin允许多域名访问的实现方法

    Java设置Access-Control-Allow-Origin允许多域名访问的实现方法

    这篇文章主要介绍了Java设置Access-Control-Allow-Origin允许多域名访问的实现方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10

最新评论