Spring boot(带有 jpa 的 mysql):没有名为“entityManagerFactory”的 bean 可用
Posted
技术标签:
【中文标题】Spring boot(带有 jpa 的 mysql):没有名为“entityManagerFactory”的 bean 可用【英文标题】:Spring boot (mysql with jpa ): No bean named 'entityManagerFactory' available 【发布时间】:2018-02-21 17:43:45 【问题描述】:开始构建一个(first)spring boot 应用程序,这是我的 spring boot 主类 (Full code on github)
@EnableAutoConfiguration
@SpringBootApplication
public class Application
public static void main(String[] args)
SpringApplication.run(Application.class, args);
这里是 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jersey</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
我不断收到以下错误。我想补充什么?为什么我需要添加一个名为 'entityManagerFactory' 的 bean bean ?即使在使用spring boot之后也有必要吗??
我的回购看起来像这样
public interface RegistrationRepo extends JpaRepository<User, Long>
User findByEmail(String email);
。 ____ _ __ _ _ /\ / ' __ _ ()_ __ __ _ \ \ \ \ ( ( )_ | '_ | '| | ' / ` | \ \ \ \ \/ )| |)| | | | | || (||))))) ' |____| .|| ||| |__, | / / / / =========|_|===============|___/=///_/ :: Spring Boot :: (v1.5.6.RELEASE)
2017-09-13 12:48:38.808 INFO 15361 --- [main] com.rightlink.RightLinkApplication:在 Admins-MacBook-Pro.local 上启动 RightLinkApplication,PID 为 15361(/Users/sureshatta/Documents/workspace- sts-3.9.0.RELEASE/RightLink/target/classes 在 /Users/sureshatta/Documents/workspace-sts-3.9.0.RELEASE/RightLink 中由 sureshatta 启动) 2017-09-13 12:48:38.811 INFO 15361 --- [main] com.rightlink.RightLinkApplication:未设置活动配置文件,回退到默认配置文件:默认 2017-09-13 12:48:38.865 INFO 15361 --- [main] ationConfigEmbeddedWebApplicationContext:刷新 org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@120d6fe6:启动日期 [Wed Sep 13 12:48:38 IST 2017];上下文层次的根 2017-09-13 12:48:40.380 INFO 15361 --- [main] s.b.c.e.t.TomcatEmbeddedServletContainer:Tomcat 使用端口初始化:8181 (http) 2017-09-13 12:48:40.402 INFO 15361 --- [main] o.apache.catalina.core.StandardService:启动服务 [Tomcat] 2017-09-13 12:48:40.403 INFO 15361 --- [main] org.apache.catalina.core.StandardEngine:启动 Servlet 引擎:Apache Tomcat/8.5.16 2017-09-13 12:48:40.566 INFO 15361 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]:初始化 Spring 嵌入式 WebApplicationContext 2017-09-13 12:48:40.567 INFO 15361 --- [ost-startStop-1] os.web.context.ContextLoader:根 WebApplicationContext:初始化在 1705 毫秒内完成 2017-09-13 12:48:40.743 INFO 15361 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean:映射 servlet:'dispatcherServlet' 到 [/] 2017-09-13 12:48:40.752 信息 15361 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean:映射过滤器:'characterEncodingFilter' 到:[/] 2017-09-13 12:48:40.753 信息 15361 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean:映射过滤器:'hiddenHttpMethodFilter' 到:[/] 2017-09-13 12:48:40.753 信息 15361 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean:映射过滤器:“httpPutFormContentFilter”到:[/] 2017-09-13 12:48:40.753 信息 15361 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean:映射过滤器:'requestContextFilter' 到:[/] 2017-09-13 12:48:40.844 WARN 15361 --- [main] ationConfigEmbeddedWebApplicationContext:上下文初始化期间遇到异常-取消刷新尝试:org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“registerController”的bean时出错:不满意通过字段“regServices”表达的依赖关系;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为“regService”的 bean 时出错:通过字段“registrationRepo”表示不满足的依赖关系;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名称为“registrationRepo”的 bean 时出错:设置 bean 时无法创建 [org.springframework.orm.jpa.SharedEntityManagerCreator] 类型的内部 bean '(inner bean)#43c67247'属性“实体管理器”;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名称为“(内部 bean)#43c67247”的 bean 时出错:设置构造函数参数时无法解析对 bean 'entityManagerFactory' 的引用;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available 2017-09-13 12:48:40.849 INFO 15361 --- [main] o.apache.catalina.core.StandardService:停止服务 [Tomcat] 2017-09-13 12:48:40.903 信息 15361 --- [主要] utoConfigurationReportLoggingInitializer:
启动 ApplicationContext 时出错。要显示自动配置报告,请在启用“调试”的情况下重新运行您的应用程序。 2017-09-13 12:48:40.975 错误 15361 --- [主] o.s.b.d.LoggingFailureAnalysisReporter:
应用程序启动失败
说明:
com.rightlink.services.RegistrationService 中的字段 registrationRepo 需要一个名为“entityManagerFactory”的 bean,但无法找到。
行动:
考虑在您的配置中定义一个名为“entityManagerFactory”的 bean。
application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/Test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
server.port=8181
尝试为 repo 添加@Repository
注释,并在主类中添加@enableJpaRepositories
注释。没有什么帮助。
【问题讨论】:
Spring(更准确地说是 JPA)需要知道你的 entityManagerFactory 在哪里,然后用它来管理实体管理器。参考docs.spring.io/spring-boot/docs/current/reference/html/… @spiritwalker 但我不需要自定义数据源,想使用默认数据源。 @ꜱᴜʀᴇꜱʜᴀᴛᴛᴀ 你确定这是你唯一的日志信息吗? @MangEngkus 我这么认为。更新了完整的堆栈跟踪。 【参考方案1】:问题不直接与引导版本有关,问题与过时的休眠 jar 相关。由于我在项目中添加了 JPA 支持,因此在内部使用 (??) Hibernate 作为 JPA 实现启动并尝试使用 (??) 那些 jar。由于我的本地 repo 损坏了hibernate-entity-* jars
,因此发生了这个奇怪的错误。
他们的comment in the code 确认他们在内部使用休眠。
<!-- JPA Data (We are going to use Repositories, Entities, Hibernate, etc...) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
从我的 maven 本地仓库中删除了完整的休眠文件夹,现在看起来没问题。
【讨论】:
您共享的应用程序对我有用。1.3.1.RELEASE
和 1.5.6.RELEASE
。我相信当您第一次下载 1.5.6 时,一个 jar 可能已经损坏。切换到它并运行mvn dependency:purge-local-repository
以删除损坏的jar。
是的,我还有一个带有 1.5.6.RELEASE
的 spring-boot 应用程序,它与您的设置相同,开箱即用。以上是关于Spring boot(带有 jpa 的 mysql):没有名为“entityManagerFactory”的 bean 可用的主要内容,如果未能解决你的问题,请参考以下文章
带有 JPA 的 Spring Boot:将 @Entity 移动到不同的包
Spring boot+Mysql+Spring data JPA一个Web的Demo
带有 Jackson 和 Spring Boot 的实体 JPA 中的循环引用