我收到此错误:
***************************
APPLICATION FAILED TO START
***************************
Description:
Method DbEntityManagerFactoryS2 in xxx.xxx.entities.DbAutoConfigurationS2 required a single bean, but 2 were found:
- dataSourceS2: defined by method 'dataSourceS2' in class path resource [xx/xx/entities/DbAutoConfigurationS2.class]
- dataSourcevb: defined by method 'dataSourcevb' in class path resource [xx/xx/entities/DbAutoConfigurationVB.class]
Action:
Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
这是java spring类:
@Configuration
@ComponentScan
@EnableJpaRepositories(entityManagerFactoryRef = "DbEntityManagerFactoryS2",
transactionManagerRef = "DbTransactionManagerS2")
@PropertySource("classpath:db-config.properties")
public class DbAutoConfigurationS2 {
static final Logger logger = LoggerFactory.getLogger(DbAutoConfigurationS2.class);
@Value("${spring.jpa.hibernate.ddl-auto}")
String ddlauto;
@Value("${spring.jpa.show-sql}")
Boolean showsql;
@Value("${spring.jpa.hibernate.naming_strategy}")
String dbstrategy;
public DbAutoConfigurationS2() {
}
/**
* CMP ( content management persist. - wrappare il metodo sotto transazione con @ Transactional )
* @return
*/
@Bean
PlatformTransactionManager DbTransactionManagerS2() {
return new JpaTransactionManager(DbEntityManagerFactoryS2().getObject());
}
@Bean
LocalContainerEntityManagerFactoryBean DbEntityManagerFactoryS2() {
logger.info("DbEntityManagerFactoryS2 enter ");
HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
//jpaVendorAdapter.setGenerateDdl(true);
jpaVendorAdapter.setShowSql(showsql);
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(dataSourceS2());
factoryBean.setJpaVendorAdapter(jpaVendorAdapter);
factoryBean.setPackagesToScan(DbAutoConfigurationVB.class.getPackage().getName());
//override di alcune proprietà specificate nel db-config.properties
Properties props = new Properties();
Map<String, Object> map = factoryBean.getJpaPropertyMap();
map.put("hibernate.hbm2ddl.auto", ddlauto.trim().toString());
map.put("org.hibernate.cfg.ImprovedNamingStrategy", dbstrategy.trim().toString());
props.putAll(map);
factoryBean.setJpaProperties(props);
return factoryBean;
}
@Bean
@ConfigurationProperties(prefix = "spring.datasourceS2")
public DataSource dataSourceS2(){
logger.info("datasource S2 enter ");
//DataSource ds =new EmbeddedDatabaseBuilder().addScript("classpath:sql/schema.sql").addScript("classpath:testdb/data.sql").build();
DataSourceBuilder ds = DataSourceBuilder.create();
logger.info("dataSource S2 = " + ds);
return ds.build();
}
我有另一个TRansaction经理因为我必须处理多个数据库..
@Configuration
@ComponentScan
@EnableJpaRepositories(entityManagerFactoryRef = "DbEntityManagerFactoryVB",
transactionManagerRef = "DbTransactionManagerVB")
@PropertySource("classpath:db-config.properties")
public class DbAutoConfigurationVB {
static final Logger logger = LoggerFactory.getLogger(DbAutoConfigurationVB.class);
@Value("${spring.jpa.hibernate.ddl-auto}")
String ddlauto;
@Value("${spring.jpa.show-sql}")
Boolean showsql;
@Value("${spring.jpa.hibernate.naming_strategy}")
String dbstrategy;
public DbAutoConfigurationVB() {
}
/**
* CMP ( content management persist. - wrappare il metodo sotto transazione con @ Transactional )
* @return
*/
@Bean
@Primary
PlatformTransactionManager DbTransactionManagerVB() {
return new JpaTransactionManager(DbEntityManagerFactoryVB().getObject());
}
@Bean
@Primary
LocalContainerEntityManagerFactoryBean DbEntityManagerFactoryVB() {
logger.info("DbEntityManagerFactoryVB enter ");
HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
//jpaVendorAdapter.setGenerateDdl(true);
jpaVendorAdapter.setShowSql(showsql);
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(dataSourcevb());
factoryBean.setJpaVendorAdapter(jpaVendorAdapter);
factoryBean.setPackagesToScan(DbAutoConfigurationVB.class.getPackage().getName());
//override di alcune proprietà specificate nel db-config.properties
Properties props = new Properties();
Map<String, Object> map = factoryBean.getJpaPropertyMap();
map.put("hibernate.hbm2ddl.auto", ddlauto.trim().toString());
map.put("org.hibernate.cfg.ImprovedNamingStrategy", dbstrategy.trim().toString());
props.putAll(map);
factoryBean.setJpaProperties(props);
return factoryBean;
}
@Bean
@ConfigurationProperties(prefix = "spring.datasourceVB")
public DataSource dataSourcevb(){
logger.info("datasource enter ");
//DataSource ds =new EmbeddedDatabaseBuilder().addScript("classpath:sql/schema.sql").addScript("classpath:testdb/data.sql").build();
DataSourceBuilder ds = DataSourceBuilder.create();
logger.info("dataSource = " + ds);
return ds.build();
}
}
所以我必须用方法包装
@Transactional(propagation = Propagation.REQUIRED,transactionManager =“DbTransactionManagerS2”)
要么
@Transactional(propagation = Propagation.REQUIRED,transactionManager =“DbTransactionManagerVB”)
为什么不起作用?我设置了factoryBean.setDataSource(dataSource_bean_name())但仍然相同...如果我用@Primary标记bAutoConfigurationVB类中的所有方法,则错误消失但是transactionManagerVb只能工作,而db目标仍然相同,而不是由正确的数据源方法..
不是正确的方法吗?
谢谢
罗伯托