问题
多数据源下,多模块依赖mybatis扫描不到xml文件,调用mapper接口出现org.apache.ibatis.binding.BindingException问题
方案说明
有一个Maven项目, 里面有common模块和主模块, 其中common模块中有若干个mybatis的mapper和xml, 结果主模块调用其mapper时提示出错, 原因是找不到mapper对应的xml映射关系.
查资料得知, 主模块的application.yml里面,配置mybatis的mapper-locations时, 用的是classpath, 只会扫描当前moduler的class, 而改为classpath*则会扫描所有jar
解决方法
handler 项目有三个数据库master、second、third,handler项目中新增引用common模块的model、dao、mapper
handler项目中新增引用common模块
<dependencies>
<dependency>
<groupId>cn.wxt.common</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependencies>
修改数据源配置
在master数据源上配置:
1.MapperScan 增加 common 模块的扫描路径
2.MAPPER_LOCATION 的classpath增加*
扫描所有master,即 “classpath*:mapper/master/*.xml”;
数据源引用配置 classpath:jdbc.properties
@Configuration
@PropertySource("classpath:jdbc.properties")
@MapperScan(basePackages = {MasterDataSourceConfig.HANDLER, MasterDataSourceConfig.COMMON}, sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {
//精确到 *.master及公共目录,与second、third数据源隔离
static final String HANDLER = "cn.wxt.gpsproxy.dao.master";
static final String COMMON = "cn.wxt.common.dao.master";
//static final String PACKAGE = "cn.wxt.*.dao.master";
static final String MAPPER_LOCATION = "classpath*:mapper/master/*.xml";
@Value("${master.datasource.url}")
private String url;
@Value("${master.datasource.username}")
private String user;
@Value("${master.datasource.password}")
private String password;
@Value("${master.datasource.driverClassName}")
private String driverClass;
@Bean(name = "masterDataSource")
@Primary
public DataSource masterDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
return dataSource;
}
@Bean(name = "masterTransactionManager")
@Primary
public DataSourceTransactionManager masterTransactionManager() {
return new DataSourceTransactionManager(masterDataSource());
}
@Bean(name = "masterSqlSessionFactory")
@Primary
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(masterDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(MasterDataSourceConfig.MAPPER_LOCATION));
sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
return sessionFactory.getObject();
}
}