Spring - application.yml 数字读取错误、eg: 000001
时间:2022-07-23
本文章向大家介绍Spring - application.yml 数字读取错误、eg: 000001,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
问题场景
application.yml 文件在读取纯数字的时候会将0开头的数字自动转换成8进制,场景如下:
- application.yml
sso:
login:
username: heiheiha
password: 00001001
通过@Value获取
@Value("${sso.login.username}")
String password = "513";
问题原因
spring在读取application.yml文件时,会先判断password的类型并进行tag标注(Tag-tag:yaml.org,2002:int),然后在解析时通过不同的策略自动转换。
当数字是0开头时,自动转换成8进制
源码如下:
- org.yaml.snakeyaml.constructor.SafeConstructor
public class ConstructYamlInt extends AbstractConstruct {
public Object construct(Node node) {
String value = 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 base = 10;
if ("0".equals(value)) {
return Integer.valueOf(0);
} else 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")) {//重点在这,会把0开头的int型自动转换为8进制
value = value.substring(1);
base = 8;
} else if (value.indexOf(':') != -1) {
String[] digits = value.split(":");
int bes = 1;
int val = 0;
for (int i = 0, j = digits.length; i < j; i++) {
val += Long.parseLong(digits[j - i - 1]) * bes;
bes *= 60;
}
return createNumber(sign, String.valueOf(val), 10);
} else {
return createNumber(sign, value, 10);
}
return createNumber(sign, value, base);
}
}
// 转换为相应进制数字
private Number createNumber(int sign, String number, int radix) {
Number result;
if (sign < 0) {
number = "-" + number;
}
try {
result = Integer.valueOf(number, radix);
} catch (NumberFormatException e) {
try {
result = Long.valueOf(number, radix);
} catch (NumberFormatException e1) {
result = new BigInteger(number, radix);
}
}
return result;
}
解决方法
很简单,将00001001 写成 '00001001'即可
- application.yml
sso:
login:
username: heiheiha
password: '00001001'
- 【分享】 纯 js 表单控件 —— 让 “增改查” 更轻松!
- K-近邻算法(KNN)概述
- 不使用DalFactory和IDAL,支持多种数据库应用
- MVC和三层,我的一个不成熟的看法,大家批批
- 实体类的二进制序列化
- 多任务验证码识别
- 一加手机系统预装APP被曝存在后门
- 单数据库,多数据库,单实例,多实例不同情况下的数据访问效率测试
- 打造轻量级的实体类数据容器
- “设计应对变化”--实例讲解一个数据同步系统
- TOP语句放到表值函数外,效率异常低下
- 从吉日嘎拉那里学到的……
- 【分享】纯js的n级联动列表框 —— 基于jQuery,支持下拉列表框和列表框,最重要的是n级,当然还有更重要的
- C#中?与??的区别
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林
- 【Linux内核】进程管理
- Django后台管理界面修改(代码修改)
- OpsnSSH抓包分析 | SSH协议分析
- 搭建简易的物联网服务端和客户端-第三次增补(二十二)
- ReentrantLock源码解析
- Nodejs连接PostgreSQL
- ReentrantReadWriteLock源码解析
- LockSupport源码解析
- Nodejs定时自动截图并发送给邮箱
- StampedLock源码解析
- 手植这棵自顶向下伸展树,何时亭亭如盖呢?
- ConcurrentLinkedDeque源码解析
- 给初学者的Gulp教程(译)
- 伸展树,据说比AVL树要简单一些