我在不同的文件中声明了这4个
EntityManagers
遵循此模板:
存储配置模板
@Configuration
@EnableJpaRepositories(
basePackages = "...myReposPackages...",
entityManagerFactoryRef = ConfigurationChanges.ENTITY_MANAGER_BEAN_NAME,
transactionManagerRef = ConfigurationChanges.TRANSACTION_MANAGER_BEAN_NAME
)
@ComponentScan("...myScanPackages...")
@EnableConfigurationProperties
public class MyRepoConfigClass {
...
...
public final static String ENTITY_MANAGER_BEAN_NAME = "...EntityManagerSingleConstant..."; // D1EntityManager / D2EntityManager / BaseEntityManager / oldDbEntityManager for different classes
public final static String TRANSACTION_MANAGER_BEAN_NAME = "...TransactionManagerSingleConstant..."; // D1TransactionManager / D2TransactionManager / BaseTransactionManager / oldDbTransactionManager for different classes
@Bean(name=ENTITY_MANAGER_BEAN_NAME)
@Qualifier(ENTITY_MANAGER_BEAN_NAME) // Not sure if this is needed, I just added it trying to make it work
public LocalContainerEntityManagerFactoryBean myClassEntityManager() {
LocalContainerEntityManagerFactoryBean em
= new LocalContainerEntityManagerFactoryBean();
... initializations ...
em.setDataSource(...myDataSource...)
em.setPackagesToScan("...EntitiesPackagesToScan...")
em.setPersistenceUnitName(ENTITY_MANAGER_BEAN_NAME); // Not sure if this is needed, I just added it trying to make it work
}
@Bean(name=TRANSACTION_MANAGER_BEAN_NAME)
@Qualifier(TRANSACTION_MANAGER_BEAN_NAME) // Not sure if this is needed, I just added it trying to make it work
public PlatformTransactionManager myClassTransactionManager() {
JpaTransactionManager transactionManager
= new JpaTransactionManager();
transactionManager.setEntityManagerFactory(
myClassEntityManager().getObject());
return transactionManager;
}
}
Services
这样地:
服务模板
@Service
public class myServiceClass {
@PersistenceContext(unitName = MyRepoConfigClass.ENTITY_MANAGER_BEAN_NAME) // Thought this might be the solution for JPA PersistenceContext, but did not work anyway
@Qualifier(MyRepoConfigClasss.ENTITY_MANAGER_BEAN_NAME) // Not sure if this is supposed to be done like this. In normal spring boot components it works
private EntityManager entityManager; // <- This injection fails
}
EntityManger
应通过以下任一方式使用
@PersistenceContext
(
单位名称
@Qualifier
然而,正如错误所说,springboot不知道这4个bean使用哪一个。
更新
完整堆栈跟踪:
组织。springframework。豆。工厂BeanCreationException:创建名为“changes”的bean时出错:注入持久性依赖项失败;嵌套异常为org。springframework。豆。工厂NoUniqueBeanDefinitionException:没有“javax”类型的限定bean。坚持不懈EntityManagerFactory可用:需要单个匹配bean,但找到5个:D1EntityManager、D2EntityManager、BaseEntityManager、oldDbEntityManager、DeviceApigurationDbConfigurationDbEntityManager
在org。springframework。豆。工厂支持AbstractAutowireCapableBeanFactory。populateBean(AbstractAutowireCapableBeanFactory.java:1383)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE]
在org。springframework。豆。工厂支持AbstractAutowireCapableBeanFactory。doCreateBean(AbstractAutowireCapableBeanFactory.java:575)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE]
在org。springframework。豆。工厂支持AbstractAutowireCapableBeanFactory。createBean(AbstractAutowireCapableBeanFactory.java:498)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE]
在org。springframework。豆。工厂支持AbstractBean工厂。lambda$doGetBean$0(AbstractBeanFactory.java:320)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE]
在org。springframework。豆。工厂支持DefaultSingletonBeanRegistry。getSingleton(DefaultSingletonBeanRegistry.java:222)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE]
在org。springframework。豆。工厂支持AbstractBean工厂。doGetBean(AbstractBeanFactory.java:318)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE]
在org。springframework。豆。工厂支持DefaultListableBeanFactory。预实例化单例(DefaultListableBeanFactory.java:846)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE]
在org。springframework。上下文支持AbstractApplicationContext。finishBeanFactoryInitialization(AbstractApplicationContext.java:869)~[spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE]
在org。springframework。上下文支持AbstractApplicationContext。刷新(AbstractApplicationContext.java:550)~[spring-context-5.0.9.RELEASE.jar:5.0.9.RELEASE]
在org。springframework。靴子SpringApplication。刷新(SpringApplication.java:780)[spring-boot-2.0.5.RELEASE.jar:2.0.5.RELEASE]
在org。springframework。靴子SpringApplication。refreshContext(SpringApplication.java:412)[spring-boot-2.0.5.RELEASE.jar:2.0.5.RELEASE]
在org。springframework。靴子SpringApplication。run(SpringApplication.java:1277)[spring-boot-2.0.5.RELEASE.jar:2.0.5.RELEASE]
在com。我的公司。装置应用程序编程接口。gw。应用main(Application.java:35)[类/:na]
原因:组织。springframework。豆。工厂NoUniqueBeanDefinitionException:没有“javax”类型的限定bean。坚持不懈EntityManagerFactory可用:需要单个匹配bean,但找到5个:D1EntityManager、D2EntityManager、BaseEntityManager、oldDbEntityManager、DeviceApigurationDbConfigurationDbEntityManager
在org。springframework。豆。工厂支持DefaultListableBeanFactory。resolveNamedBean(DefaultListableBeanFactory.java:1139)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE]
在org。springframework。豆。工厂支持DefaultListableBeanFactory。resolveNamedBean(DefaultListableBeanFactory.java:1079)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE]
在org。springframework。orm。jpa。支持PersistenceAnnotationBeanPostProcessor。FindentialManagerFactory(PersistenceAnnotationBeanPostProcessor.java:532)~[spring-orm-5.0.9.RELEASE.jar:5.0.9.RELEASE]
在org。springframework。orm。jpa。支持PersistenceAnnotationBeanPostProcessor$PersistenceElement。resolveEntityManager(PersistenceAnnotationBeanPostProcessor.java:700)~[spring-orm-5.0.9.RELEASE.jar:5.0.9.RELEASE]
在org。springframework。豆。工厂注释。InjectionMetadata$InjectedElement。注入(InjectionMetadata.java:180)~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE]
在org。springframework。orm。jpa。支持PersistenceAnnotationBeanPostProcessor。后处理属性值(PersistenceAnnotationBeanPostProcessor.java:353)~[spring-orm-5.0.9.RELEASE.jar:5.0.9.RELEASE]
... 省略17个公共框架