我在MyBatis中使用了Spring,它在单个数据库中运行得非常好。我在尝试添加另一个数据库时遇到了困难(请参见Github上的可复制示例)。
@Configuration
@MapperScan("io.woolford.database.mapper")
public class DataConfigDatabaseA {
@Bean(name="dataSourceA")
public DataSource dataSourceA() throws SQLException {
SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
dataSource.setDriver(new com.mysql.jdbc.Driver());
dataSource.setUrl("jdbc:mysql://" + dbHostA + "/" + dbDatabaseA);
dataSource.setUsername(dbUserA);
dataSource.setPassword(dbPasswordA);
return dataSource;
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSourceA());
return sessionFactory.getObject();
}
}
@Service
public class DbService {
@Autowired
private DbMapperA dbMapperA;
@Autowired
private DbMapperB dbMapperB;
public List<Record> getDabaseARecords(){
return dbMapperA.getDatabaseARecords();
}
public List<Record> getDabaseBRecords(){
return dbMapperB.getDatabaseBRecords();
}
}
Error creating bean with name 'dataSourceInitializer':
Invocation of init method failed; nested exception is
org.springframework.beans.factory.NoUniqueBeanDefinitionException:
No qualifying bean of type [javax.sql.DataSource] is defined:
expected single matching bean but found 2: dataSourceB,dataSourceA
你能看出我哪里出了问题吗?
如果要同时使用两个数据源,并且它们不是主要数据源和次要数据源,则应在由@SpringBootApplication
注释的应用程序上,通过@enableAutoConfiguration(excludes={datasourceAutoConfiguration.class})
禁用DataSourceAutoConfiguration
。之后,您可以创建自己的SQLSessionFactory
并绑定自己的DataSource
。如果还想使用DataSourceTransactionManager
,也应该这样做。
在本例中,您没有禁用DataSourceAutoConfiguration
,所以spring framework将尝试@autowired
只有一个DataSource
,但却得到了两个,错误就会发生。
正如我前面所说的,您应该禁用DataSourceAutoConfiguration
并手动配置它。
您可以按以下方式禁用数据源自动配置:
@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
public class YourApplication implements CommandLineRunner {
public static void main (String... args) {
SpringApplication.run(YourApplication.class, args);
}
}
如果您真的想同时使用多个数据库,我建议您手动注册适当的bean,例如:
package xyz.cloorc.boot.mybatis;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Repository;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.sql.DataSource;
@Configuration
public class SimpleTest {
private DataSource dsA;
private DataSource dsB;
@Bean(name = "dataSourceA")
public DataSource getDataSourceA() {
return dsA != null ? dsA : (dsA = new BasicDataSource());
}
@Bean(name = "dataSourceB")
public DataSource getDataSourceB() {
return dsB != null ? dsB : (dsB = new BasicDataSource());
}
@Bean(name = "sqlSessionFactoryA")
public SqlSessionFactory getSqlSessionFactoryA() throws Exception {
// set DataSource to dsA
return new SqlSessionFactoryBean().getObject();
}
@Bean(name = "sqlSessionFactoryB")
public SqlSessionFactory getSqlSessionFactoryB() throws Exception {
// set DataSource to dsB
return new SqlSessionFactoryBean().getObject();
}
}
@Repository
public class SimpleDao extends SqlSessionDaoSupport {
@Resource(name = "sqlSessionFactoryA")
SqlSessionFactory factory;
@PostConstruct
public void init() {
setSqlSessionFactory(factory);
}
@Override
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
super.setSqlSessionFactory(sqlSessionFactory);
}
public <T> T get (Object id) {
return super.getSqlSession().selectOne("sql statement", "sql parameters");
}
}
嗨,我是Spring的新手:我有一个与我的项目配置相关的问题; 这是我的控制器: 它是非常基本的,当我在服务器上运行它时,我得到了这个错误:
问题内容: 我正在尝试使用Spring为webapp自动装配一些bean(用于依赖注入)。一个控制器bean包含另一个bean,而另一个bean又持有另一组bean的hashmap。目前,该地图只有一个条目。当我在tomcat中运行并调用服务时,我收到一条错误消息,说第二个bean(保存在控制器中)不是唯一的 我看不到我在两次定义bean的地方,但是这是Spring的新知识,并且是自动装配的,因此
我有这个超级班: 我想确定我完全理解了解决方案。通过,我给类DAOBase指定了特定的名称“daoBaseBeanname”,应用程序可以用它来标识类DAOBase,这样就不会把它与扩展DAOBase的其他类混淆了。对吗? 谢谢你。
我有这个超级班: 谢谢你。
由于Zuul不支持与SC的brixton.m3打包的版本中的补丁(https://github.com/spring-cloud/spring-cloud-netflix/issues/412),我正在尝试将一个基于Spring Boot+Spring Cloud的项目升级到brixton.m4。我启用了Spring-boot-starter-actul和spring-cloud-starter-
我有两个类,每一个通过工厂自动生成同一个类: