背景:项目使用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; } @Override public LongValue getTenantId() { Long tenantId = TenantContextHolder.getTenantId(); return tenantId == null ? new LongValue(-1) : new LongValue(tenantId); } @Override public String getTenantIdColumn() { return configProperties.getColumn(); } @Override public boolean ignoreTable(String tableName) { return !configProperties.getTables().contains(tableName); // return TenantLineHandler.super.ignoreTable(tableName); } } MybatisPlusConfig @Configuration @AutoConfigureAfter(PageHelperAutoConfiguration.class) //@EnableTransactionManagement public class MybatisPlusConfig { @Autowired private List sqlSessionFactoryList; @Autowired private ConfigProperties configProperties; @PostConstruct public 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; } }