配置正确MySQL密码仍报access denied及entityManagerFactory创建错误如何解决
问题解决方案
错误根因
两个报错均为配置错误导致:
- properties配置文件中数据库用户名、密码的键名不符合Spring规范,无法被正确读取
- 自定义DataSource配置类逻辑错误,相当于没有给数据源设置用户名密码
- JPAQueryFactory创建逻辑错误,未关联Spring托管的上下文配置,导致EntityManagerFactory初始化冲突
修复步骤
第一步:修正application.properties配置
把错误的键名修改为Spring原生可识别的格式,修改后配置如下:spring.datasource.url=jdbc:mysql://localhost:3306/springwebservices spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=update第二步:重写AppConfiguration配置类
修正数据源配置逻辑,JPAQueryFactory直接注入Spring托管的EntityManager即可:package com.training.newspringquerydsl.config; import javax.persistence.EntityManager; import com.querydsl.jpa.impl.JPAQueryFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DriverManagerDataSource; import javax.sql.DataSource; import org.springframework.boot.context.properties.ConfigurationProperties; @Configuration // 缩小扫描范围,避免扫描到无关包下的冲突配置 @ComponentScan(basePackages = "com.training.newspringquerydsl") public class AppConfiguration { @Bean // 自动绑定spring.datasource前缀的配置到数据源对象 @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource() { return new DriverManagerDataSource(); } @Bean public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) { return new JPAQueryFactory(entityManager); } }如果你使用的是非Spring Boot原生项目,没有
@ConfigurationProperties注解,可以用@Value手动注入配置值:@Configuration @ComponentScan(basePackages = "com.training.newspringquerydsl") public class AppConfiguration { @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Value("${spring.datasource.url}") private String url; @Value("${spring.datasource.driver-class-name}") private String driverClassName; @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setUsername(username); dataSource.setPassword(password); dataSource.setUrl(url); dataSource.setDriverClassName(driverClassName); return dataSource; } @Bean public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) { return new JPAQueryFactory(entityManager); } }第三步:启动前验证
确认MySQL中已创建springwebservices数据库,root用户的密码为root、且允许localhost访问,清除项目缓存后重新编译启动即可。
内容的提问来源于stack exchange,提问作者Rutuja Gharge
相关产品推荐
相关产品推荐

