Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Boot第二个数据源导致无法自动连线字段_Java_Spring_Spring Boot - Fatal编程技术网

Java Spring Boot第二个数据源导致无法自动连线字段

Java Spring Boot第二个数据源导致无法自动连线字段,java,spring,spring-boot,Java,Spring,Spring Boot,我正在尝试用两个数据源设置一个Spring启动应用程序。我已经成功地使第一个数据源工作,但是当我添加类来处理第二个数据源时,第一个数据源不再工作,导致第一个数据源的DAO没有自动连接,这意味着DOA不能加载到我的控制器中 下面是设置第一个数据源的类 @Configuration @PropertySource({ "classpath:application.properties" }) @EnableJpaRepositories( basePackages = "digita

我正在尝试用两个数据源设置一个Spring启动应用程序。我已经成功地使第一个数据源工作,但是当我添加类来处理第二个数据源时,第一个数据源不再工作,导致第一个数据源的DAO没有自动连接,这意味着DOA不能加载到我的控制器中

下面是设置第一个数据源的类

@Configuration
@PropertySource({ "classpath:application.properties" })
@EnableJpaRepositories(
        basePackages = "digital.sheppard.dao.local",
        entityManagerFactoryRef = "localEntityManager",
        transactionManagerRef = "localTransactionManager"
)
public class LocalDBConfig {
    @Autowired
    private Environment env;

    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean localEntityManager() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(localDataSource());
        em.setPackagesToScan(new String[] { "digital.sheppard.model.local" });

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        HashMap<String, Object> properties = new HashMap<String, Object>();
        properties.put("hibernate.hbm2ddl.auto", env.getProperty("datasource.local.hibernate.ddl-auto"));
        properties.put("hibernate.dialect", env.getProperty("datasource.local.hibernate.dialect"));
        properties.put("hibernate.naming-strategy", env.getProperty("org.hibernate.cfg.ImprovedNamingStrategy"));
        em.setJpaPropertyMap(properties);


        return em;
    }

    @Primary
    public DataSource localDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("datasource.local.driver-class-name"));
        dataSource.setUrl(env.getProperty("datasource.local.url"));
        dataSource.setUsername(env.getProperty("datasource.local.username"));
        dataSource.setPassword(env.getProperty("datasource.local.password"));

        return dataSource;
    }

    @Primary
    @Bean
    public PlatformTransactionManager localTransactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(localEntityManager().getObject());
        return transactionManager;
    }
}
    @Configuration
@PropertySource({ "classpath:application.properties" })
@EnableJpaRepositories(
        basePackages = "digital.sheppard.dao.eclipse",
        entityManagerFactoryRef = "eclipseEntityManager",
        transactionManagerRef = "eclipseTransactionManager"
)
public class EclipseDBConfig {
    @Autowired
    private Environment env;

    @Bean
    public LocalContainerEntityManagerFactoryBean eclipseEntityManager() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(eclipseDataSource());
        em.setPackagesToScan(new String[] { "digital.sheppard.model.eclipse" });

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        HashMap<String, Object> properties = new HashMap<String, Object>();
        properties.put("hibernate.hbm2ddl.auto", env.getProperty("datasource.eclipse.hibernate.ddl-auto"));
        properties.put("hibernate.dialect", env.getProperty("datasource.eclipse.hibernate.dialect"));
        properties.put("hibernate.naming-strategy", env.getProperty("org.hibernate.cfg.ImprovedNamingStrategy"));
        em.setJpaPropertyMap(properties);


        return em;
    }

    public DataSource eclipseDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("datasource.eclipse.driver-class-name"));
        dataSource.setUrl(env.getProperty("datasource.eclipse.url"));
        dataSource.setUsername(env.getProperty("datasource.eclipse.username"));
        dataSource.setPassword(env.getProperty("datasource.eclipse.password"));

        return dataSource;
    }

    @Bean
    public PlatformTransactionManager eclipseTransactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(eclipseEntityManager().getObject());
        return transactionManager;
    }
}
@配置
@PropertySource({“classpath:application.properties”})
@授权代理(
basePackages=“digital.sheppard.dao.local”,
entityManagerFactoryRef=“localEntityManager”,
transactionManagerRef=“localTransactionManager”
)
公共类LocalDBConfig{
@自动连线
私人环境署;
@豆子
@初级的
public LocalContainerEntityManagerFactoryBean localEntityManager(){
LocalContainerEntityManagerFactoryBean em=新的LocalContainerEntityManagerFactoryBean();
em.setDataSource(localDataSource());
em.setPackagesToScan(新字符串[]{“digital.sheppard.model.local”});
HibernateJavaEndorapter vendorAdapter=新的HibernateJavaEndorapter();
em.setjpavendor适配器(供应商适配器);
HashMap属性=新建HashMap();
properties.put(“hibernate.hbm2ddl.auto”,env.getProperty(“datasource.local.hibernate.ddl auto”);
properties.put(“hibernate.dial”,env.getProperty(“datasource.local.hibernate.dial”);
properties.put(“hibernate.naming strategy”,env.getProperty(“org.hibernate.cfg.ImprovedNamingStrategy”);
em.setJpaPropertyMap(属性);
返回em;
}
@初级的
公共数据源localDataSource(){
DriverManager数据源dataSource=新的DriverManager数据源();
setDriverClassName(env.getProperty(“dataSource.local.driver类名”);
setUrl(env.getProperty(“dataSource.local.url”);
setUsername(env.getProperty(“dataSource.local.username”);
setPassword(env.getProperty(“dataSource.local.password”);
返回数据源;
}
@初级的
@豆子
公共平台TransactionManager localTransactionManager(){
JpaTransactionManager transactionManager=新的JpaTransactionManager();
transactionManager.SetEntityManager工厂(localEntityManager().getObject());
返回事务管理器;
}
}
下面是尝试设置第二个数据源的类

@Configuration
@PropertySource({ "classpath:application.properties" })
@EnableJpaRepositories(
        basePackages = "digital.sheppard.dao.local",
        entityManagerFactoryRef = "localEntityManager",
        transactionManagerRef = "localTransactionManager"
)
public class LocalDBConfig {
    @Autowired
    private Environment env;

    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean localEntityManager() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(localDataSource());
        em.setPackagesToScan(new String[] { "digital.sheppard.model.local" });

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        HashMap<String, Object> properties = new HashMap<String, Object>();
        properties.put("hibernate.hbm2ddl.auto", env.getProperty("datasource.local.hibernate.ddl-auto"));
        properties.put("hibernate.dialect", env.getProperty("datasource.local.hibernate.dialect"));
        properties.put("hibernate.naming-strategy", env.getProperty("org.hibernate.cfg.ImprovedNamingStrategy"));
        em.setJpaPropertyMap(properties);


        return em;
    }

    @Primary
    public DataSource localDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("datasource.local.driver-class-name"));
        dataSource.setUrl(env.getProperty("datasource.local.url"));
        dataSource.setUsername(env.getProperty("datasource.local.username"));
        dataSource.setPassword(env.getProperty("datasource.local.password"));

        return dataSource;
    }

    @Primary
    @Bean
    public PlatformTransactionManager localTransactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(localEntityManager().getObject());
        return transactionManager;
    }
}
    @Configuration
@PropertySource({ "classpath:application.properties" })
@EnableJpaRepositories(
        basePackages = "digital.sheppard.dao.eclipse",
        entityManagerFactoryRef = "eclipseEntityManager",
        transactionManagerRef = "eclipseTransactionManager"
)
public class EclipseDBConfig {
    @Autowired
    private Environment env;

    @Bean
    public LocalContainerEntityManagerFactoryBean eclipseEntityManager() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(eclipseDataSource());
        em.setPackagesToScan(new String[] { "digital.sheppard.model.eclipse" });

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        HashMap<String, Object> properties = new HashMap<String, Object>();
        properties.put("hibernate.hbm2ddl.auto", env.getProperty("datasource.eclipse.hibernate.ddl-auto"));
        properties.put("hibernate.dialect", env.getProperty("datasource.eclipse.hibernate.dialect"));
        properties.put("hibernate.naming-strategy", env.getProperty("org.hibernate.cfg.ImprovedNamingStrategy"));
        em.setJpaPropertyMap(properties);


        return em;
    }

    public DataSource eclipseDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("datasource.eclipse.driver-class-name"));
        dataSource.setUrl(env.getProperty("datasource.eclipse.url"));
        dataSource.setUsername(env.getProperty("datasource.eclipse.username"));
        dataSource.setPassword(env.getProperty("datasource.eclipse.password"));

        return dataSource;
    }

    @Bean
    public PlatformTransactionManager eclipseTransactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(eclipseEntityManager().getObject());
        return transactionManager;
    }
}
@配置
@PropertySource({“classpath:application.properties”})
@授权代理(
basePackages=“digital.sheppard.dao.eclipse”,
entityManagerFactoryRef=“eclipseEntityManager”,
transactionManagerRef=“eclipseTransactionManager”
)
公共类EclipseDBConfig{
@自动连线
私人环境署;
@豆子
public localContainerEntityManager FactoryBean eclipseEntityManager(){
LocalContainerEntityManagerFactoryBean em=新的LocalContainerEntityManagerFactoryBean();
em.setDataSource(eclipseDataSource());
em.setPackagesToScan(新字符串[]{“digital.sheppard.model.eclipse”});
HibernateJavaEndorapter vendorAdapter=新的HibernateJavaEndorapter();
em.setjpavendor适配器(供应商适配器);
HashMap属性=新建HashMap();
properties.put(“hibernate.hbm2ddl.auto”,env.getProperty(“datasource.eclipse.hibernate.ddl auto”);
properties.put(“hibernate.dialent”,env.getProperty(“datasource.eclipse.hibernate.dialent”);
properties.put(“hibernate.naming strategy”,env.getProperty(“org.hibernate.cfg.ImprovedNamingStrategy”);
em.setJpaPropertyMap(属性);
返回em;
}
公共数据源eclipseDataSource(){
DriverManager数据源dataSource=新的DriverManager数据源();
setDriverClassName(env.getProperty(“dataSource.eclipse.driver类名”);
setUrl(env.getProperty(“dataSource.eclipse.url”);
setUsername(env.getProperty(“dataSource.eclipse.username”);
setPassword(env.getProperty(“dataSource.eclipse.password”);
返回数据源;
}
@豆子
公共平台TransactionManager eclipseTransactionManager(){
JpaTransactionManager transactionManager=新的JpaTransactionManager();
transactionManager.setEntityManagerFactory(eclipseEntityManager().getObject());
返回事务管理器;
}
}
在我看来,第二个数据源正在覆盖第一个数据源,因此应用程序不再能够定位在主数据源中定义的DOA

@Configuration
@PropertySource({ "classpath:application.properties" })
@EnableJpaRepositories(
        basePackages = "digital.sheppard.dao.local",
        entityManagerFactoryRef = "localEntityManager",
        transactionManagerRef = "localTransactionManager"
)
public class LocalDBConfig {
    @Autowired
    private Environment env;

    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean localEntityManager() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(localDataSource());
        em.setPackagesToScan(new String[] { "digital.sheppard.model.local" });

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        HashMap<String, Object> properties = new HashMap<String, Object>();
        properties.put("hibernate.hbm2ddl.auto", env.getProperty("datasource.local.hibernate.ddl-auto"));
        properties.put("hibernate.dialect", env.getProperty("datasource.local.hibernate.dialect"));
        properties.put("hibernate.naming-strategy", env.getProperty("org.hibernate.cfg.ImprovedNamingStrategy"));
        em.setJpaPropertyMap(properties);


        return em;
    }

    @Primary
    public DataSource localDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("datasource.local.driver-class-name"));
        dataSource.setUrl(env.getProperty("datasource.local.url"));
        dataSource.setUsername(env.getProperty("datasource.local.username"));
        dataSource.setPassword(env.getProperty("datasource.local.password"));

        return dataSource;
    }

    @Primary
    @Bean
    public PlatformTransactionManager localTransactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(localEntityManager().getObject());
        return transactionManager;
    }
}
    @Configuration
@PropertySource({ "classpath:application.properties" })
@EnableJpaRepositories(
        basePackages = "digital.sheppard.dao.eclipse",
        entityManagerFactoryRef = "eclipseEntityManager",
        transactionManagerRef = "eclipseTransactionManager"
)
public class EclipseDBConfig {
    @Autowired
    private Environment env;

    @Bean
    public LocalContainerEntityManagerFactoryBean eclipseEntityManager() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(eclipseDataSource());
        em.setPackagesToScan(new String[] { "digital.sheppard.model.eclipse" });

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        HashMap<String, Object> properties = new HashMap<String, Object>();
        properties.put("hibernate.hbm2ddl.auto", env.getProperty("datasource.eclipse.hibernate.ddl-auto"));
        properties.put("hibernate.dialect", env.getProperty("datasource.eclipse.hibernate.dialect"));
        properties.put("hibernate.naming-strategy", env.getProperty("org.hibernate.cfg.ImprovedNamingStrategy"));
        em.setJpaPropertyMap(properties);


        return em;
    }

    public DataSource eclipseDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("datasource.eclipse.driver-class-name"));
        dataSource.setUrl(env.getProperty("datasource.eclipse.url"));
        dataSource.setUsername(env.getProperty("datasource.eclipse.username"));
        dataSource.setPassword(env.getProperty("datasource.eclipse.password"));

        return dataSource;
    }

    @Bean
    public PlatformTransactionManager eclipseTransactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(eclipseEntityManager().getObject());
        return transactionManager;
    }
}

我的第二个数据源会停止第一个数据源中的DAO而不再加载,这有什么原因吗?

我设法让它工作了,我不完全确定问题出在哪里。我最终放弃了课程,重新开始

对于其他有类似问题的人,这里是我的application.properties文件

primary.datasource.url = jdbc:mysql://192.168.1.19/ticket
primary.datasource.username = username
primary.datasource.password = password
primary.datasource.driver-class-name = com.mysql.jdbc.Driver

secondary.datasource.url = jdbc:mysql://192.168.1.19/ticket2
secondary.datasource.username = username
secondary.datasource.password = passwprd
secondary.datasource.driver-class-name = com.mysql.jdbc.Driver
定义主数据源、事务管理器和实体管理器的类

@Configuration
@EnableJpaRepositories(
        basePackages = "digital.sheppard.dao.local",
        entityManagerFactoryRef = "localEntityManager",
        transactionManagerRef = "localTransactionManager"
)
public class LocalDBConfig {

    @Bean
    @Primary
    @ConfigurationProperties(prefix="primary.datasource")
    public DataSource primaryDataSource() {
        DataSource ds = DataSourceBuilder.create().build();

        return ds;
    }

    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean localEntityManager() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(primaryDataSource());
        em.setPackagesToScan(new String[] { "digital.sheppard.model.local" });

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);

        return em;
    }

    @Primary
    @Bean
    public PlatformTransactionManager localTransactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(localEntityManager().getObject());
        return transactionManager;
    }

}
定义第二个数据源的类非常相似,请注意排除@Primary

@Configuration
@EnableJpaRepositories(
        basePackages = "digital.sheppard.dao.eclipse",
        entityManagerFactoryRef = "eclipseEntityManager",
        transactionManagerRef = "eclipseTransactionManager"
)
public class EclipseDBConfig {

    @Bean
    @ConfigurationProperties(prefix="secondary.datasource")
    public DataSource secondaryDataSource() {
        DataSource ds = DataSourceBuilder.create().build();

        return ds;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean eclipseEntityManager() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(secondaryDataSource());
        em.setPackagesToScan(new String[] { "digital.sheppard.model.eclipse" });

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);

        return em;
    }

    @Bean
    public PlatformTransactionManager eclipseTransactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(eclipseEntityManager().getObject());
        return transactionManager;
    }

}
主数据源的DOA与辅助数据源的DOA相同,只是辅助数据源定义了在@Transactional注释中使用哪个事务管理器

@Transactional(transactionManager = "eclipseTransactionManager")
@Repository
public interface Person2Dao extends CrudRepository<Person2, Integer> {

}
事务性(transactionManager=“eclipseTransactionManager”) @存储库 公共接口人员2DAO扩展CrudRepository{ }