YAML是JSON的一个超集,可以非常方便地将外部配置以层次结构形式存储起来。作为人员来说,使用YAML文件进行配置,可以使得我们的配置看起来层次更加直观,后期维护也比较方便,但是在使用YAML文件作为springboot的配置文件时,也时常会遇到各种坑,今天就将这些坑做一个小汇总和记录。
1.空格上出现的坑
首先是YAML文件是按照特定语法来解析文件的,当我们的配置文件格式出现错误时则会解析失败,而做容易出错的莫过于配置的键值对在冒号后还需要一个空格才能正常解析,如:
在port:之后我们需要加上一个空格,然后在跟上我们的端口号3090,而且还有一种比较特殊的情况,在YAML文件中有两种空格是不一样的,一种是我们键盘输入的空格(ASCII值是32),还有一种是不间断空格(non-breaking space,ASCII值是160),但我们在冒号后加的空格是不间断空格时,文件是不能被正常解析的,当然这坑不常见,一般只有在网页直接复制的配置才可能出现这总情况。
2. 不允许出现一样的同级属性
在YAML文件中是不允许出现一样的同级属性,就如:
其中这两个server就是同级且同名的两个配置,是不允许的,这个问题常常在我们的配置文件比较长比较复杂时出现
3. Springboot中使用@Value注入属性报错
在代码中使用@Value读取配置文件中的配置并注入是非常方便的,但是@Value却有他的局限性,@Value只能注入一些简单数据结构的数据,当我们需要读取配置文件中的一个数组数据并注入spring boot中时,则会报错,如下
然后我们尝试使用@Value注入customer-role.customerAllowMenuIds
然后就会发现程序启动时会报java.lang.IllegalArgumentException: Could not resolve placeholder 'customer-role.customerAllowMenuIds' in value "${customer-role.customerAllowMenuIds}"的错误
所以一般来说,当我们需要注入List或者数组之类的数据时,大多都是@ConfigurationProperties的方式将变量注入类的属性中。
但是如果你决意使用@Value来注入的话也可以尝试将配置文件中配置改变一下
再使用@Value("#{'${customer-role.customerAllowMenuIds}'.split(',')}")来注入
可以看到上面我们使用了spring的表达式#{},功能还是很强大的,有兴趣可以深入了解下。它同样可以使得我们可以很方便的使用@Value注入如Map等其他的复杂结构的数据。