当前使用版本(必须填写清楚,否则不予处理)

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映射有问题