SpringBoot中YAML的小坑业务场景原因方案

业务场景

在自定义配置中有一个设备对象, 其中设备编号属性名为"no"

读取配置时会强制将其转换为Boolean, 导致项目无法启动

原因

Spring Boot解析YAML使用的是SnakeYAML, 问题的根源就在它对于"no"的解析上

首先, 在项目启动时, SnakeYAML会初始化一系列的解析器, 下面这个解析器就是罪魁祸首:

预置解析器.png

其中的first即配置属性的首字母, 我们的"no"正好符合, 开头字母为n

接下来开始编译自定义配置, SnakeYAML的流程如下:

  1. 将所有内容解析为node
  2. 读取属性的第一个字母, 获取预置解析器
  3. 使用解析器的正则反向匹配整个属性, 如果匹配成功, 为其打上Tag

使用正则反向匹配.png

n开头的resolvers中包含一个匹配"yesno"的正则, 我们的"no"就这样被打上了Tag.BOOL

方案

解决方案很简单, 我们只需要为no加上两个单引号, 从no变为'no'即可