当前使用版本(必须填写清楚,否则不予处理)
3.12
该问题是怎么引起的?(最新版上已修复的会直接close掉)
使用多租户功能 但是 使用代码配置去数据源 和 sessionfactory ===> PaginationIntercepto 拦截器无效, 正常使用配置文件配置 没有问题
重现步骤
@Value("${spring.datasource.type}")
private Class<? extends DataSource> dataSourceType;
@Bean(name = "dataSource", destroyMethod = "close", initMethod = "init")
@ConfigurationProperties(prefix = "spring.datasource")
@Primary
public DataSource dataSource() {
return DataSourceBuilder.create().type(dataSourceType).build();
}
@Bean
public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource,
@Qualifier("paginationInterceptor") PaginationInterceptor paginationInterceptor) throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
// sqlSessionFactoryBean.setTypeAliasesPackage("com.entity");
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
sqlSessionFactoryBean.setDatabaseIdProvider(databaseIdProvider);
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:mapper/*.xml"));
sqlSessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
Interceptor[] plugins = new Interceptor[] { paginationInterceptor };
sqlSessionFactoryBean.setPlugins(plugins);
System.out.println(paginationInterceptor.getSqlParserList().size());
return sqlSessionFactoryBean.getObject();
}
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
List<ISqlParser> sqlParserList = new ArrayList<>();
TenantSqlParser tenantSqlParser = new TenantSqlParser();
tenantSqlParser.setTenantHandler(new TenantHandler() {
@Override
public String getTenantIdColumn() {
return "tenant_id";
}
@Override
public Expression getTenantId() {
return new LongValue(1L);
}
@Override
public boolean doTableFilter(String tableName) {
// TODO Auto-generated method stub
return false;
}
});
sqlParserList.add(tenantSqlParser);
paginationInterceptor.setSqlParserList(sqlParserList);
paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
@Override
public boolean doFilter(MetaObject metaObject) {
// 自定义过滤是否查询
return false;
}
});
return paginationInterceptor;
}
报错信息
Comment From: miemieYaho
自行排查
Comment From: lhl14
找到问题了 就是 拦截器配置要写在加载 xml文件之前 Interceptor[] plugins = new Interceptor[] { paginationInterceptor }; sqlSessionFactoryBean.setPlugins(plugins);sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/.xml")); sqlSessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
Comment From: WilliamShoww
找到问题了 就是 拦截器配置要写在加载 xml文件之前 Interceptor[] plugins = new Interceptor[] { paginationInterceptor }; sqlSessionFactoryBean.setPlugins(plugins);sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/.xml")); sqlSessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
是不是自己注入了sqlSessionFactoryBean 就很多配置都失效了?我也是3.1.2,因为我发现自己注入了这个对象,mapper-location失效了,globalconfig也失效了,我手动set进去就可以了
Comment From: renektonwu
找到问题了 就是 拦截器配置要写在加载 xml文件之前 Interceptor[] plugins = new Interceptor[] { paginationInterceptor }; sqlSessionFactoryBean.setPlugins(plugins);sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/.xml")); sqlSessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
是不是自己注入了sqlSessionFactoryBean 就很多配置都失效了?我也是3.1.2,因为我发现自己注入了这个对象,mapper-location失效了,globalconfig也失效了,我手动set进去就可以了
兄弟你的可以了嘛,我的是2.2.0版本,好多配置失效了
@Override public String getTenantIdColumn() {
return "tenant_id";
}
@Override
public Expression getTenantId() {
return new LongValue(1L);
}
@Override
public boolean doTableFilter(String tableName) {
// TODO Auto-generated method stub
return false;
}
这3个方法一直进不来
Comment From: renektonwu
好痛苦
Comment From: smile2014
@renektonwu 运行时动态创建sessionFactory试过没。我老是扫描不到xml,或者mapper映射有问题