Spring 扩展QueryDslRepositorySupport和多个数据源时获取NonuniqueBeandDefinitionException

Spring 扩展QueryDslRepositorySupport和多个数据源时获取NonuniqueBeandDefinitionException,spring,hibernate,spring-data-jpa,querydsl,multiple-databases,Spring,Hibernate,Spring Data Jpa,Querydsl,Multiple Databases,我需要使用多个数据库。 我使用的是Spring Boot+Spring数据JPA, 所以我有两个配置类: @配置 @启用事务管理 @EnableJpaRepositories(basePackages=“com.rest.dao.first”, entityManagerFactoryRef=“firstEntityManagerFactory”,transactionManagerRef=“firstTransactionManager”) 公共静态类DnbbJdbcConfig{ @初级的

我需要使用多个数据库。 我使用的是Spring Boot+Spring数据JPA, 所以我有两个配置类:

@配置
@启用事务管理
@EnableJpaRepositories(basePackages=“com.rest.dao.first”,
entityManagerFactoryRef=“firstEntityManagerFactory”,transactionManagerRef=“firstTransactionManager”)
公共静态类DnbbJdbcConfig{
@初级的
@豆子
@ConfigurationProperties(前缀=“datasource.first”)
公共数据源数据源(){
返回DataSourceBuilder.create().build();
}
@初级的
@Bean(name=“firstEntityManagerFactory”)
公共LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder){
返回生成器
.dataSource(dataSource())
.packages(“com.rest.dao.first”)
.持久性单位(“第一”)
.build();
}
@初级的
@Bean(name=“firstTransactionManager”)
平台事务管理器事务管理器(EntityManagerFactoryBuilder){
返回新的JpaTransactionManager(entityManagerFactory(builder.getObject());
}
}
@配置
@启用事务管理
@EnableJpaRepositories(basePackages=“com.rest.dao.second”,
entityManagerFactoryRef=“secondEntityManagerFactory”,transactionManagerRef=“secondTransactionManager”)
公共静态类SmsJdbcConfig{
@豆子
@ConfigurationProperties(前缀=“datasource.second”)
公共数据源数据源(){
返回DataSourceBuilder.create().build();
}
@Bean(name=“secondEntityManagerFactory”)
@PersistenceContext(unitName=“second”)
公共LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder){
返回生成器
.dataSource(dataSource())
.packages(“com.rest.dao.second”)
.持久性单位(“第二”)
.build();
}
@Bean(name=“secondTransactionManager”)
平台事务管理器事务管理器(EntityManagerFactoryBuilder){
返回新的JpaTransactionManager(entityManagerFactory(builder.getObject());
}
}
我想没有错误和正确。 所以,当我使用默认存储库时,不会出现错误。 (例如userRepository.findById()-多数据源中无错误)

但是,当我使用自定义存储库时,就会出现错误。 ()

定制工具

公共类FirstRepositoryImpl扩展QueryDslRepositorySupport实现FirstCustomRepository{
public FirstRepositoryImpl(){
超级(头等舱);
}
@PersistenceContext(unitName=“first”)
私人实体管理者实体管理者;
私有QFirst first=QFirst.first;
@凌驾
公共列表消息(){
JPAQuery query=新的JPAQuery(entityManager);
返回query.from(first.list)(first.message);
}   
}
例外情况

原因:org.springframework.beans.factory.NonuniqueBeandDefinitionException:未定义[javax.persistence.EntityManagerFactory]类型的符合条件的bean:应为单个匹配bean,但找到2:firstEntityManagerFactory,secondEntityManagerFactory
在org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findDefaultEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:582)~[spring-orm-4.2.3.RELEASE.jar:4.2.3.RELEASE]
在org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.FindentialManagerFactory(PersistenceAnnotationBeanPostProcessor.java:541)~[spring-orm-4.2.3.RELEASE.jar:4.2.3.RELEASE]
在org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.resolveEntityManager(PersistenceAnnotationBeanPostProcessor.java:707)~[spring-orm-4.2.3.RELEASE.jar:4.2.3.RELEASE]
在org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.getResourceToInject(PersistenceAnnotationBeanPostProcessor.java:680)~[spring-orm-4.2.3.RELEASE.jar:4.2.3.RELEASE]
在org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:178)~[spring-beans-4.2.3.RELEASE.jar:4.2.3.RELEASE]
在org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)~[spring-beans-4.2.3.RELEASE.jar:4.2.3.RELEASE]
在org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:354)~[spring-orm-4.2.3.RELEASE.jar:4.2.3.RELEASE]
... 省略45个公共框架
我误解了什么吗

我在github存储库中编写了示例代码。。 我自己解决了:

我正在检查
querydsl repositorysupport.class
并找到了答案

@PersistenceContext
公共无效设置EntityManager(EntityManager EntityManager){
Assert.notNull(entityManager);
this.querydsl=新的querydsl(entityManager,builder);
this.entityManager=entityManager;
}
@PersistenceContext没有“unitName” 因此,Spring无法注入EntityManager

我创建
QueryDslRepositorySupportWrapper.java
并手动注入EntityManager

它是有效的

我自己解决了:

我正在检查
querydsl repositorysupport.class
并找到了答案

@PersistenceContext
公共无效设置EntityManager(EntityManager EntityManager){
Assert.notNull(entityManager);
this.querydsl=新的querydsl(entityManager,builder);
this.entityManager=entityManager;
}
@PersistenceContext没有“unitName” 因此,Spring无法注入EntityManager

我创建
QueryDslRepositorySupportWrapper.java
并手动注入EntityManager

它是有效的


您得到的例外是直接的。您定义了两个类型相同的bean。为了避免这种例外情况,可以使用@Qualifier(secondEntityManagerFac