2つの個別のデータベースがあり、リポジトリでそれらにアクセスしようとしています。残念ながら、次の例外が発生します。
私が試したもの
My 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
My order controllerこれは単にリポジトリの自動配線です
@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();
}
}
および2番目の構成
@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() {
第二のため。
この例外は、JPA自動設定を除外することでも対処できます。通常、エンティティマネージャーが2つある場合は、手動で構成を行うため、自動構成に依存しても意味がありません。
DataSourceAutoconfigurationとJpaBaseConfigurationから継承するすべてを除外する必要があります
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration}
public class MySpringApp() {}
または
@SpringBootAutoconfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration)
public class MySpringApp() {}