业务场景
在自定义配置中有一个设备对象, 其中设备编号属性名为”no”
读取配置时会强制将其转换为Boolean, 导致项目无法启动
原因
Spring Boot解析YAML使用的是SnakeYAML, 问题的根源就在它对于”no”的解析上
首先, 在项目启动时, SnakeYAML会初始化一系列的解析器, 下面这个解析器就是罪魁祸首:
其中的first即配置属性的首字母, 我们的”no”正好符合, 开头字母为n
接下来开始编译自定义配置, SnakeYAML的流程如下:
- 将所有内容解析为node
- 读取属性的第一个字母, 获取预置解析器
- 使用解析器的正则反向匹配整个属性, 如果匹配成功, 为其打上Tag
n开头的resolvers中包含一个匹配”yesno”的正则, 我们的”no”就这样被打上了Tag.BOOL
方案
解决方案很简单, 我们只需要为no加上两个单引号, 从no变为’no’即可
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END