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.RELEASE1.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

带有 Axon 的 Spring Boot JPA

带有 Jackson 和 Spring Boot 的实体 JPA 中的循环引用

带有查询 Spring-Boot jpa 1.5 的可选参数

带有spring boot JPA Postgresql的data.sql未加载