J'ai 2 bases de données distinctes et j'essaie d'y accéder dans des référentiels. Malheureusement, je reçois l'exception suivante.
Ce que j'ai essayé
Mon 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
Mon contrôleur de commande qui est simplement un référentiel de câblage automatique
@RestController
@RequestMapping("/Order")
public class OrderController {
@Autowired
private OrderRepository nextGenorder;
Mon référentiel de commandes a
@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;
}
Mon fichier 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();
}
}
et deuxième configuration
@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;
}
}
J'ai essayé de déboguer dans PersistenceAnnotationBeanPostProcessor mais j'ai été perdu bientôt.
Je pense que vous devriez nommer vos LocalContainerEntityManagerFactoryBean dans les deux configurations. Il devrait donc ressembler à:
@Bean(name = "nextGenEntityManagerFactory")
@Primary
public LocalContainerEntityManagerFactoryBean nextGenEntityManagerFactory() {
pour le premier et
@Bean(name = "gatcLimsEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean gatcLimsEntityManagerFactory() {
pour le second.
Cette exception peut également être résolue en excluant l'autoconfiguration JPA. Habituellement, quand il y a deux gestionnaires d'entités, la configuration se fait de toute façon manuellement, il est donc inutile de s'appuyer sur la configuration automatique pour cela.
DataSourceAutoconfiguration doit être exclu et tout ce qui hérite de JpaBaseConfiguration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration}
public class MySpringApp() {}
ou
@SpringBootAutoconfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration)
public class MySpringApp() {}