springboot配置文件0开头的数字自动被转换成为其他值/与原值不匹配/值很奇怪
1.现象
在springboot配置文件需要使用字符串类型的数值时候,有时候直接写一个0开头的数值,例如011。配置生效之后,打印配置参数时候发现不对。输入的是数值9。试过很多次,都是一样的情况。刚刚开始还以为是有配置字段冲突导致其他内部配置覆盖了我们自定义的参数。改了字段名称之后发现一样的结果。
google之后找到如下源码:
public class ConstructYamlInt extends AbstractConstruct { public ConstructYamlInt() { } public Object construct(Node node) { String value = SafeConstructor.this.constructScalar((ScalarNode)node).toString().replaceAll("_", ""); int sign = 1; char first = value.charAt(0); if (first == '-') { sign = -1; value = value.substring(1); } else if (first == '+') { value = value.substring(1); } int basex = true; if ("0".equals(value)) { return 0; } else { byte base; if (value.startsWith("0b")) { value = value.substring(2); base = 2; } else if (value.startsWith("0x")) { value = value.substring(2); base = 16; } else { if (!value.startsWith("0")) { if (value.indexOf(58) == -1) { return SafeConstructor.this.createNumber(sign, value, 10); } String[] digits = value.split(":"); int bes = 1; int val = 0; int i = 0; for(int j = digits.length; i < j; ++i) { val = (int)((long)val + Long.parseLong(digits[j - i - 1]) * (long)bes); bes *= 60; } return SafeConstructor.this.createNumber(sign, String.valueOf(val), 10); } value = value.substring(1); base = 8; } return SafeConstructor.this.createNumber(sign, value, base); } } }
通过源码发现:
1、以0b开头的数字,会被当做二进制数处理
2、以0x开头的数字,会被当做十六进制数处理
3、以0开头的数字,会被当做八进制数处理
2.配置文件
config: 011
3.解决方案
config: "011"
在配置文件数值上面加上双引号即可解决数值自动转换问题