解决A component required a bean named 'entityManagerFactory' that could not be found.问题

问题

在调试SpringBoot集成多数据源的工程过程中,启动异常。错误如下:

***************************
APPLICATION FAILED TO START
***************************

Description:

A component required a bean named 'entityManagerFactory' that could not be found.


Action:

Consider defining a bean named 'entityManagerFactory' in your configuration.

 

分析

统计了一下网上针对此类问题发生的原因:

【原因1】jar包冲突
https://blog.csdn.net/babyyaoyao/article/details/81132016
        该文是因为在pom.xml文件中spring-boot-starter-data-jpa中指定了<version>2.0.3.RELEASE</version>导致,解决方案是删除该version即可。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>2.0.3.RELEASE</version>
        </dependency>
        

其解释发生异常的原因可能是出现了与hibernate的jar包冲突。
        
【原因2】jar包损坏
1)helsonxiao commented on 28 Mar 2018
I had the same error. After deleting all repos under .m2 folder and redownloading. It works.

2)HSamiSari answered Jul 12  2018

I had exact same issue. When I checked maven build log I have realised that there was an error about hibernate packages complaining about "invalid LOC header (bad signature)". I solved by deleting sub directories under .m2\repository\org\hibernate\hibernate-core and recompiling my project.
    
解决方式是删除损坏的jar,重新加载。

 

以上两个解决方式我都试过,但问题依然未解决。说明我的问题是另外一种情况。

后面再仔细研究代码,尝试调整了一下代码,终于找到原因:

在DBConfig1.java文件中错误的配置数据源的方式:

    …… 

    private DataSource dataSource1;

	/**
	 * @methodDesc: 功能描述:(配置数据源)
	 */
	@Bean(name = "dataSource1")
	@ConfigurationProperties(prefix = "mysql.datasource.test1")
	public DataSource createDataSource() {
		dataSource1 = DataSourceBuilder.create().build();
		return dataSource1;
	}

	……

	@Primary
	@Bean(name = "entityManagerFactory1")
	public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
		if(dataSource1 == null) {
			createDataSource();
		}
		return builder.dataSource(dataSource1).properties(getVendorProperties())
				.packages("com.example.demo.entity") // 设置实体类所在位置
				.persistenceUnit("primaryPersistenceUnit").build();
	}

 

解决

把数据源注入独立到一个配置类DataSourceConfig.java中:

    @Bean(name = "dataSource1")
    @Qualifier("dataSource1")
    @Primary
    @ConfigurationProperties(prefix="mysql.datasource.test1")
    public DataSource dataSource1() {
        return DataSourceBuilder.create().build();
    }

在另一个配置文件DBConfig1.java中使用该数据源:

     @Autowired 
	@Qualifier("dataSource1")
	private DataSource dataSource1;

	@Primary
	@Bean(name = "entityManager1")
	public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
		return entityManagerFactory(builder).getObject().createEntityManager();
	}

	@Primary
	@Bean(name = "entityManagerFactory1")
	public LocalContainerEntityManagerFactoryBean       entityManagerFactory(EntityManagerFactoryBuilder builder) {
		return builder.dataSource(dataSource1).properties(getVendorProperties())
				.packages("com.example.demo.entity") // 设置实体类所在位置
				.persistenceUnit("primaryPersistenceUnit").build();
	}

问题解决了。

文章结束。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
这个报错提示是说在你的CommentService类的构造函数中需要一个名为entityManagerFactorybean,但是Spring容器中没有找到这个bean。 解决方案: 1. 确认你的Spring Boot应用中是否已经配置了entityManagerFactory,可以在application.properties文件中添加以下配置: ``` spring.jpa.hibernate.ddl-auto=update spring.datasource.url=jdbc:mysql://localhost:3306/your-database-name?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false&maxReconnects=10&useSSL=false spring.datasource.username=your-username spring.datasource.password=your-password spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true ``` 2. 确认你的CommentService类中是否正确注入了entityManagerFactory,例如: ``` @Service public class CommentService { private final EntityManager entityManager; public CommentService(EntityManager entityManager) { this.entityManager = entityManager; } //... } ``` 如果是采用构造函数注入的方式,可以尝试添加一个默认的无参构造函数。 ``` @Service public class CommentService { private final EntityManager entityManager; public CommentService(EntityManager entityManager) { this.entityManager = entityManager; } public CommentService() { this.entityManager = null; } //... } ``` 代码示例:https://github.com/linlinjava/litemall/blob/master/litemall-db/src/main/java/org/linlinjava/litemall/db/service/CommentService.java

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值