Spring Boot启动报错:找不到名为entityManagerFactory的Bean
entityManagerFactory Bean的解决方案 先来看下你提供的启动错误日志:
____ _ __ _ _ /\ / ' __ _ ( ) __ __ _ \ \ \ ( ( )_ _ | '_ | ' | | ' / ` | \ \ \/ __ )| | )| | | | | || ( | | ) ) ) ) ' | | .__| | | | | | _ , | / / / / =========| |==============| /=/ / / / :: Spring Boot :: (v2.3.3.RELEASE) 2020-08-30 18:09:53.081 INFO 4536 --- [ restartedMain] com.App.Shopping.ShoppingApplication : 正在DESKTOP-DSCQJON上启动ShoppingApplication,PID为4536(由sarat在D:\sarat\eclipse-workspace\Shopping.zip_expanded\Shopping目录启动,路径为D:\sarat\eclipse-workspace\Shopping.zip_expanded\Shopping\target\classes) 2020-08-30 18:09:53.081 INFO 4536 --- [ restartedMain] com.App.Shopping.ShoppingApplication : 未设置活跃配置文件,回退到默认配置文件:default 2020-08-30 18:09:53.148 INFO 4536 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : 以DEFAULT模式引导Spring Data JPA仓库。 2020-08-30 18:09:53.151 INFO 4536 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Spring Data仓库扫描完成,耗时3ms,发现1个JPA仓库接口。 2020-08-30 18:09:53.256 INFO 4536 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat已初始化,端口为:8083(http) 2020-08-30 18:09:53.256 INFO 4536 --- [ restartedMain] o.apache.catalina.core.StandardService : 正在启动服务[Tomcat] 2020-08-30 18:09:53.256 INFO 4536 --- [ restartedMain] org.apache.catalina.core.StandardEngine : 正在启动Servlet引擎:[Apache Tomcat/9.0.37] 2020-08-30 18:09:53.325 INFO 4536 --- [ restartedMain] org.apache.jasper.servlet.TldScanner : 至少有一个JAR被扫描TLD但未包含任何TLD。启用此日志记录器的调试日志可获取完整的扫描JAR列表。跳过不必要的JAR扫描可提升启动和JSP编译时间。 2020-08-30 18:09:53.327 INFO 4536 --- [ restartedMain] o.a.c.c.C.[Tomcat-24].[localhost].[/] : 正在初始化Spring嵌入式WebApplicationContext 2020-08-30 18:09:53.327 INFO 4536 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : 根WebApplicationContext初始化完成,耗时244ms 2020-08-30 18:09:53.339 WARN 4536 --- [ restartedMain] ConfigServletWebServerApplicationContext : 上下文初始化期间遇到异常,取消刷新尝试:org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为'shoppingController'的Bean出错:通过字段'userservice'表达的依赖不满足;嵌套异常为org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为'userServiceImpl'的Bean出错:通过字段'repository'表达的依赖不满足;嵌套异常为org.springframework.beans.factory.BeanCreationException: 创建在ShoppingApplication上@EnableJpaRepositories声明的com.App.Shopping.model.repository.UserRepository中定义的名为'userRepository'的Bean出错:设置Bean属性'entityManager'时无法创建类型为[org.springframework.orm.jpa.SharedEntityManagerCreator]的内部Bean '(inner bean)#71a2245c';嵌套异常为org.springframework.beans.factory.BeanCreationException: 创建名为'(inner bean)#71a2245c'的Bean出错:设置构造函数参数时无法解析对Bean 'entityManagerFactory'的引用;嵌套异常为org.springframework.beans.factory.NoSuchBeanDefinitionException: 找不到名为'entityManagerFactory'的Bean 2020-08-30 18:09:53.340 INFO 4536 --- [ restartedMain] o.apache.catalina.core.StandardService : 正在停止服务[Tomcat] 2020-08-30 18:09:53.344 INFO 4536 --- [ restartedMain] ConditionEvaluationReportLoggingListener : 启动ApplicationContext出错。重新运行应用并启用'debug'可显示条件报告。 2020-08-30 18:09:53.400 ERROR 4536 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter : 应用启动失败 描述:com.App.Shopping.model.service.UserServiceImpl中的repository字段需要名为'entityManagerFactory'的Bean,但未找到。注入点带有以下注解: - @org.springframework.beans.factory.annotation.Autowired(required=true) 动作:考虑在配置中定义名为'entityManagerFactory'的Bean。
问题分析
从日志里能清晰看到,整个启动失败的根源是Spring容器找不到entityManagerFactory这个Bean。这个Bean是Spring Boot自动配置JPA时默认创建的,负责管理JPA的实体管理器,现在它缺失导致JPA仓库初始化失败,进而引发了依赖注入的连锁错误。
一步步解决问题
1. 检查项目依赖是否齐全
首先确认你的pom.xml(Maven)或build.gradle(Gradle)里有没有包含Spring Data JPA和对应数据库的驱动依赖,这是自动配置entityManagerFactory的基础:
Maven示例(pom.xml):
<!-- Spring Data JPA 核心依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- MySQL驱动(根据你用的数据库替换,比如Oracle、PostgreSQL) --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
Gradle示例(build.gradle):
implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'mysql:mysql-connector-java'
如果这些依赖缺失,Spring Boot根本无法触发JPA的自动配置流程。
2. 验证数据库配置是否正确
打开你的application.properties或application.yml,检查数据库连接配置是否准确,比如地址、用户名、密码、驱动类名:
application.properties示例:
# 数据库连接信息 spring.datasource.url=jdbc:mysql://localhost:3306/你的数据库名?useSSL=false&serverTimezone=UTC spring.datasource.username=你的数据库用户名 spring.datasource.password=你的数据库密码 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # JPA相关配置 spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
配置错误会导致Spring无法创建数据源,进而无法生成entityManagerFactory。
3. 确认主启动类的注解配置
你的主启动类ShoppingApplication已经加了@EnableJpaRepositories,但要确保这个注解的basePackages指向了你的JPA仓库所在的包,或者主启动类本身在根包下(这样Spring会自动扫描所有子包):
package com.App.Shopping; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication @EnableJpaRepositories(basePackages = "com.App.Shopping.model.repository") // 明确指定仓库所在包 public class ShoppingApplication { public static void main(String[] args) { SpringApplication.run(ShoppingApplication.class, args); } }
如果包路径指定错误,Spring找不到你的仓库接口,也会影响entityManagerFactory的创建。
4. 手动配置entityManagerFactory(自动配置失效时)
如果以上步骤都试过还是不行,可以手动创建这个Bean,写一个JPA配置类:
package com.App.Shopping.config; import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; @Configuration public class JpaConfig { @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource); em.setPackagesToScan("com.App.Shopping.model"); // 你的实体类所在包路径 HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); return em; } @Bean public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(emf); return transactionManager; } }
这个配置类会手动生成entityManagerFactory和事务管理器,替代Spring Boot的自动配置。
内容的提问来源于stack exchange,提问作者Sarath Kumar




