iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >使用@Value 注入 List 类型的配置属性需要注意的 BUG
  • 949
分享到

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

2024-04-02 19:04:59 949人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

@Value 注入 List 类型的配置属性 @Value 注解可以方便的帮助我们注入配置属性值. 那么当注入一个 List 类型时该怎么做呢? 想必大家都会知道,可以使用下面这种写

@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>。

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

--结束END--

本文标题: 使用@Value 注入 List 类型的配置属性需要注意的 BUG

本文链接: https://www.lsjlt.com/news/131685.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用@Value 注入 List 类型的配置属性需要注意的 BUG
    @Value 注入 List 类型的配置属性 @Value 注解可以方便的帮助我们注入配置属性值. 那么当注入一个 List 类型时该怎么做呢? 想必大家都会知道,可以使用下面这种写...
    99+
    2022-11-12
  • Java1.5的Enum类型使用时需要注意什么
    本篇内容主要讲解“Java1.5的Enum类型使用时需要注意什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java1.5的Enum类型使用时需要注意什么”吧!注意点:1。所有创建的枚举类型都...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作