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

<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.5</version> </dependency>

该问题是如何引起的?(确定最新版也有问题再提!!!)

1.前提:项目规范分层分责任,所有持久层代码必须写在Mapper里面 2.实现:所以QueryWrapper,UpdateWrapper都在写Mapper里面,并且方法都是由default关键字修饰,如下: `@InterceptorIgnore( tenantLine = "true" ) default void select(Long id, String name) { LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(User.class); lambdaQueryWrapper .eq(User::getId, id) .eq(User::getName, name); selectList(queryWrapper);

} ` 3.问题:部分方法需要忽略租户拦截,但是发现default关键字修饰的方法加了注解不管用@InterceptorIgnore( tenantLine = "true" ),必须使用public方法然后手写SQL才可以

重现步骤(如果有就写完整)

default关键字修饰的方法加注解@InterceptorIgnore( tenantLine = "true" )无法忽略租户拦截

@InterceptorIgnore( tenantLine = "true" ) default void select(Long id, String name) { LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(User.class); lambdaQueryWrapper .eq(User::getId, id) .eq(User::getName, name); selectList(queryWrapper);

}

报错信息

无报错,租户拦截不生效

Comment From: nieqiurong

改的没用,最多只是把select的方法注册到拦截缓存里了,但select方法调用的selectList,实际执行的mappedstatment是selectList,到插件那只会是selectList.

Comment From: hitcp

改的没用,最多只是把select的方法注册到拦截缓存里了,但select方法调用的selectList,实际执行的mappedstatment是selectList,到插件那只会是selectList.

我看引入租户插件后每次查询都会执行此方法: com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor#beforeQuery

然后这个方法里面会调用【InterceptorIgnoreHelper#willIgnore】从本地缓存和SQL解析缓存判断是否忽略,如果这两个缓存任意一个中存在就表示忽略租户拦截,SQL查询就不拦截,所以放在应该这两个缓存任意一个应该就可以吧

com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper#willIgnore
    /**
     * SQL 解析缓存
     * key 可能是 mappedStatement 的 ID,也可能是 class 的 name
     */
    private static final Map<String, IgnoreStrategy> IGNORE_STRATEGY_CACHE = new ConcurrentHashMap<>();
    /**
     *  本地线程拦截器忽略策略缓存
     */
    private static final ThreadLocal<IgnoreStrategy> IGNORE_STRATEGY_LOCAL = new ThreadLocal<>();

Comment From: nieqiurong

目前你只能走线程上下文的方式.