文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用@Value 注入 List 类型的配置属性需要注意的 BUG

2024-04-02 19:55

关注

@Value 注入 List 类型的配置属性

@Value 注解可以方便的帮助我们注入配置属性值.

那么当注入一个 List 类型时该怎么做呢?

想必大家都会知道,可以使用下面这种写法:


 @Value("#{'${zf.ids}'.split(',')}")
 private List<Integer> ids;

上面的配置简单说下就是,先使用 ${zf.ids} 拿到配置文件中 zf.ids 属性的值,然后使用 #{} 也就是 SPEL 表达式语言进行按,拆分,得到的结果转为 List<Integer>类型的值.

这样做没什么问题,可以说完美解决了 注入复杂类型的配置文件的属性

那么问题来了

如果 我们想要配置文件没有 zf.ids属性的时候注入一个空的 List 该怎么办呢?

这时候你可能说简单嘛,给 ${zf.ids}加个默认值就好了: ${zf.ids:}


 @Value("#{'${zf.ids:}'.split(',')}")
 private List<Integer> ids;

如上面所示,我们使用:来给 zf.ids添加一个默认值,为空.

那么这时候,我们的 ids 属性值的内容是什么呢?

是 空的 List<Integer>对象? 还是 ids 的值就是个 null 呢?

我们来实践一下:看看到底是什么?

打个断点,调试走起,可以看到:

image-20200918102125292

竟然不是 空 List,而且有一个值,我们看下 List 中的值到底是什么:

image-20200918102228396

发现竟然只有一个值为 null 的元素 !

跟踪源码查看 @Value("#{'${zf.ids:}'.split(',')}") 的解析过程

其中最关键的一步就是下面整个方法org.springframework.beans.TypeConverterDelegate#convertIfNecessary(java.lang.String, java.lang.Object, java.lang.Object, java.lang.Class, org.springframework.core.convert.TypeDescriptor)

会发现: ${zf.ids:) 被解析为 "" 一个空的字符串;

然后调用 SpEL 再次解析: #{''.split(',')} 即 返回一个数组,这个数组只有一个空的字符串

在这里插入图片描述

然后 Spring 会运用一系列的 Converter 进行类型转换,关键就在这一步:

String[] --> List<Integer> 时, 把数组中的空字符串转为 Integer 类型时,由于不能传唤,默认就是个 null

整个转过过程就是

[""] --> {""} --> {null}

最后我们就得到了一个只有一个 null 值的 List 集合!

至此,真相大白,在使用 @Value("#{'${zf.ids:}'.split(',')}") 注入 List 属性的时候尤其需要注意这个问题,搞不好就是个线上 bug ! ! !

@Value注入map、List,yaml格式

使用@Value注入map、List

实体类


@Value("#{'${list}'.split(',')}")
private List<String> list;
 
@Value("#{${maps}}")  
private Map<String,String> maps;

配置文件


list: topic1,topic2,topic3
maps: "{key1: 'value1', key2: 'value2'}"

ps:注意上面的map解析中,一定要用""把map所对应的value包起来,要不然解析会失败,导致不能转成 Map<String,String>。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯