SpringBoot通过Mybatis配置多数据源的时候,为何无法加载mybatisAppConfig.xml文件中的枚举处理类typeHandler?

一般在SpringBoot项目中,都是通过mybatis-generator插件读取generatorConfig.xml自动生成mapper.xml文件、Mapper.java、entity实体类等。如果有枚举类转换处理,可以放到mybatisAppConfig.xml文件中配置。然后,通过设置一个简单的数据源配置类就可以了,如下:

@Configuration
@MapperScan("com.glodon.fates.release.dao")
public class MybatisConfig {
   //空,什么也不写,会加载默认的sqlSessionFactory类
} 

但是,如果你是多数据源,那么你需要将上面空的部分手动配置成每个数据源特有的属性。这样,mybatis就不会自动加载

MybatisAutoConfiguration.java这个配置类里面的sqlSessionFactory。而这个类做的其中一件事情就是加载mybatisAppConfig.xml配置文件!一旦你用了自己的写的sqlSessionFactory,但是有没有手动配置mybatisAppConfig.xml文件,就会无法加载其中的typeHandler枚举处理类。所以手动配置多数据源的时候,应该这样写:

@Configuration
@MapperScan(basePackages = "com.glodon.fates.datatransfer.dao.release", sqlSessionTemplateRef = "releaseSqlSessionTemplate")
public class ReleaseDataSourceConfig {

  @Value("${spring.datasource.release.url}")
  private String releaseUrl;
  @Value("${spring.datasource.release.username}")
  private String releaseUsername;
  @Value("${spring.datasource.release.password}")
  private String releasePassword;

  /**
   * release系统数据源配置.
   */
  @Bean(name = "releaseDataSource")
  public DataSource releaseDataSource() {
    HikariConfig config = new HikariConfig();
    config.setDriverClassName("com.mysql.jdbc.Driver");
    config.setAutoCommit(false);
    config.setJdbcUrl(releaseUrl);
    config.setUsername(releaseUsername);
    config.setPassword(releasePassword);
    return new HikariDataSource(config);
  }

  /**
   * sqlSession配置.
   */
  @Bean(name = "releaseSqlSessionFactory")
  public SqlSessionFactory releaseSqlSessionFactory(@Qualifier("releaseDataSource") DataSource dataSource) throws Exception {
    SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
    sessionFactoryBean.setDataSource(dataSource);
    PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    sessionFactoryBean.setConfigLocation(resolver.getResource("classpath:mybatisAppConfig.xml"));
    sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
        .getResources("classpath:com/glodon/fates/datatransfer/mapper/release/*.xml"));
    return sessionFactoryBean.getObject();
  }

  @Bean(name = "releaseTransactionManager")
  public DataSourceTransactionManager releaseTransactionManager(@Qualifier("releaseDataSource") DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
  }

  @Bean(name = "releaseSqlSessionTemplate")
  public SqlSessionTemplate releaseSqlSessionTemplate(@Qualifier("releaseSqlSessionFactory") SqlSessionFactory sqlSessionFactory)
      throws Exception {
    return new SqlSessionTemplate(sqlSessionFactory);
  }

}

 

红色部分代码是关键的配置mybatisAppConfig.xml路径的地方,只要加上这段就可以了。具体原理可以参考:

http://www.mybatis.org/mybatis-3/zh/configuration.html (mybatis中的xml映射关系),也可以参考

Spring-boot-autoconfigure的jar包下的org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration.java源码类。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值