SpringBoot添加自定义数据源后出现MySQL访问权限异常求助
解决Spring Boot自定义DataSource后MySQL权限异常问题
问题根源
你添加的PersistenceConfiguration配置类中,自定义的dataSource() Bean只设置了数据库URL,没有指定用户名和密码。Spring Boot在这种情况下会默认使用当前系统用户名(你的Windows用户名XXX)尝试连接MySQL,且不携带密码,这直接导致了SQLException: Access denied for user 'XXX'@'localhost' (using password: NO)异常。你之前执行的创建用户、授权SQL完全无效,因为你的应用根本没用到这个XXX用户。
解决方案
方案1:删除自定义配置类(推荐,除非有特殊需求)
既然你之前未添加该配置类时,所有CRUD操作都正常,说明Spring Boot的自动数据源配置完全满足需求。直接删除PersistenceConfiguration.java,恢复自动配置即可解决问题。
方案2:完善自定义DataSource配置
如果确实需要自定义数据源Bean,必须在代码中补充用户名和密码的配置,推荐从application.properties中读取配置值,保持配置集中管理:
修改后的PersistenceConfiguration.java代码:
package com.cg.conferencedemo2.config; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.beans.factory.annotation.Value; import javax.sql.DataSource; @Configuration public class PersistenceConfiguration { @Value("${spring.datasource.username}") private String dbUsername; @Value("${spring.datasource.password}") private String dbPassword; @Bean public DataSource dataSource(){ DataSourceBuilder builder = DataSourceBuilder.create(); builder.url("jdbc:mysql://localhost:3306/conference_demo?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC"); builder.username(dbUsername); // 配置数据库用户名 builder.password(dbPassword); // 配置数据库密码 System.out.println("My custom datasource bean has been initialized and set"); return builder.build(); } }
方案3:使用配置属性绑定(更简洁)
通过@ConfigurationProperties注解,让自定义DataSource直接绑定application.properties中的spring.datasource前缀配置,无需手动逐个设置:
package com.cg.conferencedemo2.config; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.boot.context.properties.ConfigurationProperties; import javax.sql.DataSource; @Configuration public class PersistenceConfiguration { @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource(){ DataSourceBuilder builder = DataSourceBuilder.create(); System.out.println("My custom datasource bean has been initialized and set"); return builder.build(); } }
额外说明
- 不要手动创建系统用户名对应的MySQL用户,这完全是无效操作,问题核心是自定义数据源未配置正确的认证信息。
- 如果你需要切换数据源类型(比如从默认的HikariCP换成Druid),可以在
DataSourceBuilder.create()后调用builder.type(XXXDataSource.class)指定类型。
内容的提问来源于stack exchange,提问作者user18472511
相关产品推荐
相关产品推荐

