@TenantIgnore注解不生效

Blade 未结 3 685
fanglh
fanglh 2024-01-10 15:20

岗位分页查询接口,数据表支持租户隔离,并且已经验证成功。截图如下: image.png

针对该分页接口,直接加上@TenantIgnore注解,如下图,发现再次调用还是追加了租户过滤。说明注解不生效,是什么原因呢???

image.png

image.png

3条回答
  •  446070931
    446070931 (楼主)
    2024-01-10 21:00

    @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();
    		}
    	}


提交回复