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

本文详细解析了SpringBoot项目中多数据源配置引起的启动异常问题,通过调整数据源和EntityManagerFactory的配置,成功解决了找不到'entityManagerFactory'的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

在调试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.youkuaiyun.com/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();
	}

问题解决了。

文章结束。

升级到springboot3.3.7后,启动报错2025-05-28T14:29:27.304+08:00 WARN 14584 --- [todo-integration-server] [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'matterEntityManagerFactory' defined in file [E:\workSpace\cnooc_platform\eadcloud-todo-integration-server\server\hd-todo-integration-server\build\resources\main\META-INF\spring\todo-integration-service.xml]: Cannot create inner bean 'org.springframework.data.jpa.support.MergingPersistenceUnitManager#5a205ee5' of type [org.springframework.data.jpa.support.MergingPersistenceUnitManager] while setting bean property 'persistenceUnitManager' 2025-05-28T14:29:27.349+08:00 WARN 14584 --- [todo-integration-server] [ main] c.t.c.loader.WebappClassLoaderBase : The web application [ROOT] appears to have started a thread named [Thread-7] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: java.base@17.0.1/sun.net.dns.ResolverConfigurationImpl.notifyAddrChange0(Native Method) java.base@17.0.1/sun.net.dns.ResolverConfigurationImpl$AddressChangeListener.run(ResolverConfigurationImpl.java:176) 2025-05-28T14:29:27.446+08:00 ERROR 14584 --- [todo-integration-server] [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPLICATION FAILED TO START *************************** Description: A component required a bean named 'dataSource' that could not be found. Action: Consider defining a bean named 'dataSource' in your configuration.
05-29
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值