岗位分页查询接口,数据表支持租户隔离,并且已经验证成功。截图如下:
针对该分页接口,直接加上@TenantIgnore注解,如下图,发现再次调用还是追加了租户过滤。说明注解不生效,是什么原因呢???
@Slf4j @Aspect public class BladeTenantAspect { @Around("@annotation(tenantIgnore)") public Object around(ProceedingJoinPoint point, TenantIgnore tenantIgnore) throws Throwable { try { //开启忽略 BladeTenantHolder.setIgnore(Boolean.TRUE); //执行方法 return point.proceed(); } finally { //关闭忽略 BladeTenantHolder.clear(); } } }
方法嵌套时会在执行第一个mapper方法后执行下面这个方法(可自行debug查看源码实现)
BladeTenantHolder.clear()
案例: @TenantIgnore m1(){ m2(); m3(); } m2(){ m2Mapper.selectOne(); } m3(){ m3Mapper.selectOne(); }
导致:ignore忽略租户标识清除,后面的mapper方法取不到ignore标识,执行mybatisplus方法时拼接tenant_id。
建议改造方案(仅供参考):
@Around("@annotation(tenantIgnore)") public Object around(ProceedingJoinPoint point, TenantIgnore tenantIgnore) throws Throwable { Boolean ignore = BladeTenantHolder.isIgnore(); if (ignore){ return point.proceed(); } try { //开启忽略 BladeTenantHolder.setIgnore(Boolean.TRUE); //执行方法 return point.proceed(); } finally { //关闭忽略 BladeTenantHolder.clear(); } }
扫一扫访问 Blade技术社区 移动端