Spring Boot 3.1.4从环境变量读取数据源属性失败求助
基于Spring Boot 3.1.4、Java 17构建应用,在
application.properties中通过环境变量配置数据源:spring.datasource.url=jdbc:mysql://${DB_HOST}:${DB_PORT}/my_database spring.datasource.username=${DB_USER_DEV} spring.datasource.password=${DB_PASSWORD_DEV}运行时报错:
java.sql.SQLException: Access denied for user '${DB_USER_DEV}'@'localhost' (using password: YES),但硬编码账号密码或为环境变量设置默认值(如${DB_USER_DEV:my_username})时可正常运行。Windows命令行/PowerShell中能正常输出环境变量值,MySQL CLI用相同凭证可连接,且${DB_HOST}和${DB_PORT}能正常读取。
排查与解决步骤
检查环境变量作用域与IDE加载状态
Windows临时设置的环境变量(如通过set DB_USER_DEV=xxx在cmd中设置)仅对当前命令行会话有效,IDE(如IDEA、Eclipse)不会继承该会话的变量。需将变量添加到用户环境变量或系统环境变量中,然后重启IDE让其重新加载环境变量。核对环境变量名称拼写
虽然Windows环境变量不区分大小写,但Spring Boot的占位符是严格匹配字符的。仔细检查DB_USER_DEV和DB_PASSWORD_DEV的拼写,包括下划线、大小写是否完全一致,避免出现类似DB_USER_DeV或DB_USERDEV的拼写错误。排查配置覆盖问题
Spring Boot配置存在优先级,检查是否有其他配置源覆盖了这两个值:- 查看是否存在
application-dev.properties、application-prod.properties等环境特定配置文件,里面是否硬编码了spring.datasource.username或spring.datasource.password; - 检查应用启动参数,是否通过命令行参数(如
--spring.datasource.username=xxx)或VM参数(如-Dspring.datasource.username=xxx)指定了账号密码,这些参数的优先级高于application.properties中的配置。
- 查看是否存在
启用配置调试日志定位问题
在application.properties中添加日志配置:logging.level.org.springframework.core.env=DEBUG启动应用后,查看日志中关于
PropertySources的输出,Spring Boot会打印所有加载的属性源及对应的值,可明确DB_USER_DEV和DB_PASSWORD_DEV是否被成功读取。临时用系统属性传递验证
启动应用时,在VM参数中直接传递变量值:-DDB_USER_DEV=你的用户名 -DDB_PASSWORD_DEV=你的密码如果这样配置后应用能正常连接,说明环境变量读取环节存在问题,可回到前几点排查;如果仍失败,需检查数据源配置的其他细节(如数据库权限、驱动版本等)。
内容的提问来源于stack exchange,提问作者Hugo Fraix

