2-5.数据类型转换
约 515 字大约 2 分钟
2025-06-24
最近一名开发者在使用 Spring 属性注入时遇到了一个问题,这个问题是由 Bean 的属性注入引发的,最终导致了线上事故。这个问题具有一定的代表性,因此在这里分享给大家,希望能引起大家的重视。
1. 问题描述
该开发者在连接数据库时配置正确,但程序运行时却报出密码错误:
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
这个错误提示表明用户名和密码不匹配,但实际上密码并没有输入错误。
2. 问题分析
开发者在 application.yml
文件中配置了数据库连接信息,密码设置为 0127
,如下所示:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
username: root
password: 0127
问题就出在密码 0127
上。在 Spring Boot 中,YAML 文件中的数字默认支持八进制格式。因此,0127
被 Spring Boot 识别为一个八进制数,转换成十进制后变成了 87
。最终,程序使用错误的密码 87
连接数据库,导致密码错误。
3. 根本原因
在基础篇讲解属性注入时,我们提到过整数类型支持二进制、八进制和十六进制的表示方式。当后台使用 String
类型接收数据时,如果配置文件中配置了一个整数值,程序会先按照整数进行处理,读取后再转换成字符串。因此,0127
被 Spring Boot 识别为一个八进制数,并转换为了十进制数 87
。
4. 注意事项
- 字符串标准书写加上引号包裹,养成习惯。 在 YAML 文件中,为了明确指定一个值为字符串类型,应该使用引号将其包裹起来,例如
"0127"
。 - 遇到 0 开头的数据多注意。 在处理以
0
开头的数据时,要特别注意其是否会被解析为八进制数。