背景:项目使用mybatis分页插件不生效,以及多租户使用时读取配置异常
分页插件不细述,网上很多方法试了还是不生效,最后修改到当前版本解决,直接上代码
多租户插件使用遇到的问题:
最开始在MyTenantLineHandler中使用 @Value(“${tables}”),服务启动时能从配置中心拉取到配置,但在运行时获取到的值为空,试了很多方法都不生效,后面将配置中心的配置在调用MyTenantLineHandler的那一层向下传递配置值,问题解决
租户配置
@Component@RefreshScope@ConfigurationProperties(prefix = "saas.tenant")public class ConfigProperties {public void setColumn(String column) {this.column = column;}public void setTables(List tables) {this.tables = tables;}public String getColumn(){return this.column;}public List getTables(){return this.tables;}private String column="";private List tables= Lists.newArrayList();}
TenantLineHandler
public class MyTenantLineHandler implements TenantLineHandler {private final ConfigProperties configProperties;public MyTenantLineHandler(ConfigProperties configProperties) {this.configProperties = configProperties;}@Overridepublic LongValue getTenantId() {Long tenantId = TenantContextHolder.getTenantId();return tenantId == null ? new LongValue(-1) : new LongValue(tenantId);}@Overridepublic String getTenantIdColumn() {return configProperties.getColumn();}@Overridepublic boolean ignoreTable(String tableName) {return !configProperties.getTables().contains(tableName);// return TenantLineHandler.super.ignoreTable(tableName);}}
MybatisPlusConfig
@Configuration@AutoConfigureAfter(PageHelperAutoConfiguration.class)//@EnableTransactionManagementpublic class MybatisPlusConfig {@Autowiredprivate List sqlSessionFactoryList;@Autowiredprivate ConfigProperties configProperties;@PostConstructpublic void addMyInterceptor() {MybatisPlusInterceptor interceptor = mybatisPlusInterceptor();for (SqlSessionFactory factory : sqlSessionFactoryList) {factory.getConfiguration().addInterceptor(interceptor);}}/** * mybatisplus 分页拦截器 * @return */public MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());TenantLineInnerInterceptor tenantLineInnerInterceptor=new TenantLineInnerInterceptor();tenantLineInnerInterceptor.setTenantLineHandler(new MyTenantLineHandler(configProperties));interceptor.addInnerInterceptor(tenantLineInnerInterceptor);return interceptor;}}