问题
新项目需要配置多数据源,之前配置过,我就直接接手。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 {
结束
当初接过来项目,没有看启动类配置,一开始以为是配置问题,倒腾了半天配置,最后发现是启动项问题,也真是醉了。打工不易,但明天依旧蕴含着希望,希望也会眷顾那些相信它的人。