mybatis plus+sharding+动态数据源启动报错:Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required
**mybatis plus+sharding+动态数据源启动报错:Property ‘sqlSessionFactory’ or ‘sqlSessionTemplate’ are required**百度Google搜了一大堆都说不能用 druid springboot启动器 ,但是我用的是HikariCP ,压根没有druid的包。根据报错debug发现是缺少sqlSessionTemplat
·
**
mybatis plus+sharding+动态数据源启动报错:Property ‘sqlSessionFactory’ or ‘sqlSessionTemplate’ are required
**
百度Google搜了一大堆都说不能用 druid springboot启动器 ,但是我用的是HikariCP ,压根没有druid的包。
根据报错debug发现是缺少sqlSessionTemplate bean导致的这个问题。
sqlSessionTemplate的创建是在MybatisPlusAutoConfiguration中,仔细看了下MybatisPlusAutoConfiguration源码,
如图,只有在DataSource能够唯一确定下来才会加载这个配置,当我们配置了sharding和动态数据源的时候会创建两个各自的DataSource,导致这个config根本不会加载,同时sqlSessionTemplate也不会加载。
解决办法
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider;
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import org.apache.shardingsphere.shardingjdbc.spring.boot.SpringBootConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
/**
* @author: xxx
* @Date: 2021/9/7 14:36
* @Description:
*/
@Configuration
@AutoConfigureBefore(DynamicDataSourceAutoConfiguration.class)
@AutoConfigureAfter(SpringBootConfiguration.class)
public class DataSourcesConfig {
@Autowired
private DynamicDataSourceProperties properties;
@Autowired
private DataSource shardingDataSource;
@Bean
public DynamicDataSourceProvider dynamicDataSourceProvider() {
return new AbstractDataSourceProvider() {
@Override
public Map<String, DataSource> loadDataSources() {
Map<String, DataSource> dataSourceMap = new HashMap<>(2);
dataSourceMap.put("sharding", shardingDataSource);
return dataSourceMap;
}
};
}
@Bean
@Primary
public DataSource dataSource() {
DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();
dataSource.setPrimary(properties.getPrimary());
dataSource.setStrict(properties.getStrict());
dataSource.setStrategy(properties.getStrategy());
dataSource.setP6spy(properties.getP6spy());
dataSource.setSeata(properties.getSeata());
return dataSource;
}
}
创建这样一个配置类,有两个作用:1.把sharding的DataSource交给动态数据源管理 2.把动态数据源的DataSource设置为主数据源,这样MybatisPlusAutoConfiguration就会加载了
最后,我用的动态数据源版本是
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
不同版本可能不太相同
更多推荐
已为社区贡献1条内容
所有评论(0)