我收到此错误:

***************************
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目标仍然相同,而不是由正确的数据源方法..

不是正确的方法吗?

谢谢

罗伯托