双数据源启动报错: required a bean named ‘entityManagerFactory‘ that could not be found

项目配置双数据源问题

问题

新项目需要配置多数据源,之前配置过,我就直接接手。SpringBoot的版本为1.5.4,项目底层使用hibernate JPA。由于之前配置过,所以比较快速的配置完了,结果启动时发现项目报错。找不到entityManagerFactory,但是配置文件中我配置了两个工厂,但是都是取得别名。

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

Description:

Field attachmentRepository in com.rpo.rpm.bll.impl.AttachmentServiceImpl required a bean named 'entityManagerFactory' that could not be found.


Action:

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

解决思路

第一次尝试解决,把主数据源的配置的工厂别名称改为entityManagerFactory,启动发现主数据源可以使用,但是从数据源依然访问不到,在JpaRepository的实现类里打断点发现,entityManager创建了两次,但是进来的都是主数据源,第一次尝试失败。
在这里插入图片描述
第二次尝试解决,只要把数据源的entityManagerFactory修改成别的名字,启动就会报错找不到这个工厂,莫非SpringBoot1.5.4版本启动只认识entityManagerFactory,不支持多数据源,上网查发现支持,而且实现方法一个思路。排除掉架构问题,那就是有个东西在找entityManagerFactory,第二次尝试失败。

第三次尝试解决,开启debug之路,从项目入口开始找,在项目的启动类中,发现了一个关于Jpa的注解@EnableJpaRepositories(repositoryImplementationPostfix = “Impl”),用于Srping JPA的代码配置,用于取代xml形式的配置文件,查看文档发现,它指定了repositoryFactoryBeanClass、entityManagerFactoryRef和transactionManagerRef,所以项目中的配置无法起到作用,只要去掉这个注解项目就可以启动,第三次尝试成功。

@SpringBootApplication
@EnableConfigurationProperties({SystemParam.class})
@EnableJpaRepositories(repositoryImplementationPostfix = "Impl")
@EnableCaching
public class Application extends SpringBootServletInitializer {

结束

当初接过来项目,没有看启动类配置,一开始以为是配置问题,倒腾了半天配置,最后发现是启动项问题,也真是醉了。打工不易,但明天依旧蕴含着希望,希望也会眷顾那些相信它的人。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个报错提示是说在你的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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值