我有2个独立的数据库,我试图在存储库中访问它们。不幸的是,我收到以下异常。
我尝试过的事情
我的ExceptionTrace
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'orderController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.crud.repository.mymerkNew.OrderRepository com.crud.controller.OrderController.nextGenorder; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'orderRepository': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined: expected single matching bean but found 2: mymerkLimsEntityManagerFactory,nextGenEntityManagerFactory at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:762) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691) at org.springframework.boot.SpringApplication.run(SpringApplication.java:321) at org.springframework.boot.SpringApplication.run(SpringApplication.java:961) at org.springframework.boot.SpringApplication.run(SpringApplication.java:950) at com.mymerkbiotech.orange.crud.Application.main(Application.java:24) Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.mymerkbiotech.orange.crud.repository.mymerkNew.OrderRepository com.mymerkbiotech.orange.crud.controller.OrderController.nextGenorder; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'orderRepository': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined: expected single matching bean but found 2: mymerkLimsEntityManagerFactory,nextGenEntityManagerFactory at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) ... 16 more Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'orderRepository': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined: expected single matching bean but found 2: mymerkLimsEntityManagerFactory,nextGenEntityManagerFactory at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:357) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1127) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1051) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533) ... 18 more Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [javax.persistence.EntityManagerFactory] is defined: expected single matching bean but found 2: mymerkLimsEntityManagerFactory,nextGenEntityManagerFactory at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findDefaultEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:572) at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:531) at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.resolveEntityManager(PersistenceAnnotationBeanPostProcessor.java:697) at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.getResourceToInject(PersistenceAnnotationBeanPostProcessor.java:670) at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:169) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:354) ... 29 more
我的 订单控制器 就是自动装配库
@RestController @RequestMapping("/Order") public class OrderController { @Autowired private OrderRepository nextGenorder;
我的订单存储库 有
@Repository public class OrderRepository extends AbstractRepository<Order> implements OrderRepositoryInterface { private static final String SELECT_QUERY = "select p from v_orders p"; @PersistenceContext(name = "nextGenEntityManagerFactory") private EntityManager nextGenEntityManagerFactory;; public EntityManager getEntityManager() { return nextGenEntityManagerFactory; } public void setEntityManager(EntityManager entityManager) { this.nextGenEntityManagerFactory = entityManager; } public List<Order> selectAll() { javax.persistence.Query query = nextGenEntityManagerFactory .createQuery(SELECT_QUERY); List<Order> order = query.getResultList(); return order; }
我的FirstConfig文件
@Configuration @EnableTransactionManagement @EnableJpaRepositories(basePackages = "xx.xx.xx.crud.repository.running", entityManagerFactoryRef = "nextGenEntityManagerFactory", transactionManagerRef = "transactionManagerOne") @PropertySource("classpath:application.properties") public class NextGenDbConfig { @Value("${spring.datasourcemymerkNew.driver-class-name}") String driverClassName = ""; @Value("${spring.datasourcemymerkNew.url}") String url = ""; @Value("${spring.datasourcemymerkNew.username}") String userName = ""; @Value("${spring.datasourcemymerkNew.password}") String password = ""; @Autowired @Qualifier("jpaNextGenVendorApapter") JpaVendorAdapter jpaNextGenVendorApapter; @Bean(name = "nextGenDataSource") @Primary public DataSource nextGenDataSource() { return DataSourceBuilder.create().url(url) .driverClassName(driverClassName).username(userName) .password(password).build(); } @Bean @Primary public LocalContainerEntityManagerFactoryBean nextGenEntityManagerFactory() { LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); factoryBean.setDataSource(nextGenDataSource()); factoryBean.setJpaVendorAdapter(jpaNextGenVendorApapter); factoryBean.setPackagesToScan(R.nextGenDB_PACKAGE); factoryBean.setPersistenceUnitName("nextGenPersistenceUnit"); factoryBean.setJpaProperties(additionalProperties()); return factoryBean; } @Bean PlatformTransactionManager transactionManagerOne() { return new JpaTransactionManager(nextGenEntityManagerFactory() .getObject()); } @Bean(name = "jpaNextGenVendorApapter") @Primary public JpaVendorAdapter jpaNextGenVendorAdapter() { HibernateJpaVendorAdapter jpaNextGenVendorAdapter = new HibernateJpaVendorAdapter(); jpaNextGenVendorAdapter.setShowSql(true); jpaNextGenVendorAdapter.setGenerateDdl(true); jpaNextGenVendorAdapter.setDatabase(Database.MYSQL); return jpaNextGenVendorAdapter; } Properties additionalProperties() { Properties properties = new Properties(); properties.setProperty("hibernate.hbm2ddl.auto", "create-drop"); properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect"); return properties; } @Bean public HibernateExceptionTranslator hibernateExceptionTranslator() { return new HibernateExceptionTranslator(); } }
和第二个配置
@Configuration @EnableTransactionManagement @EnableJpaRepositories(basePackages = "com.mymerkbiotech.orange.crud.repository.running", entityManagerFactoryRef = "mymerkLimsEntityManagerFactory", transactionManagerRef = "transactionManagertwo") @PropertySource("classpath:application.properties") public class mymerkDbConfig { @Value("${spring.datasourcemymerkLims.driver-class-name}") String driverClassName = ""; @Value("${spring.datasourcemymerkLims.url}") String url = ""; @Value("${spring.datasourcemymerkLims.username}") String userName = ""; @Value("${spring.datasourcemymerkLims.password}") String password = ""; @Autowired @Qualifier("jpamymerkVendorAdapter") JpaVendorAdapter mymerkVendorAdapter; @Bean(name = "mymerklimsDataSource") public DataSource mymerklimsDataSource() { return DataSourceBuilder.create().url(url) .driverClassName(driverClassName).username(userName) .password(password).build(); } @Bean public LocalContainerEntityManagerFactoryBean mymerkLimsEntityManagerFactory() { LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); factoryBean.setDataSource(mymerklimsDataSource()); factoryBean.setJpaVendorAdapter(mymerkVendorAdapter); factoryBean.setPackagesToScan(R.mymerkDB_PACKAGE); factoryBean.setPersistenceUnitName("mymerklimsPersistenceUnit"); factoryBean.afterPropertiesSet(); return factoryBean; } @Bean PlatformTransactionManager transactionManagerTwo() { return new JpaTransactionManager(mymerkLimsEntityManagerFactory() .getObject()); } @Bean(name = "jpamymerkVendorAdapter") public JpaVendorAdapter jpamymerkVendorAdapter() { HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); jpaVendorAdapter.setShowSql(true); jpaVendorAdapter.setGenerateDdl(true); jpaVendorAdapter.setDatabase(Database.MYSQL); return jpaVendorAdapter; } Properties additionalProperties() { Properties properties = new Properties(); properties.setProperty("hibernate.hbm2ddl.auto", "create-drop"); properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect"); return properties; } }
我尝试在 PersistenceAnnotationBeanPostProcessor中 进行调试,但很快就迷路了。
我认为您应该在两种配置中都命名LocalContainerEntityManagerFactoryBean。所以它应该看起来像:
@Bean(name = "nextGenEntityManagerFactory") @Primary public LocalContainerEntityManagerFactoryBean nextGenEntityManagerFactory() {
对于第一个
@Bean(name = "gatcLimsEntityManagerFactory") public LocalContainerEntityManagerFactoryBean gatcLimsEntityManagerFactory() {
第二。