You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:33:22