当前使用版本(必填,否则不予处理)
<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
} ` 3.问题:部分方法需要忽略租户拦截,但是发现default关键字修饰的方法加了注解不管用@InterceptorIgnore( tenantLine = "true" ),必须使用public方法然后手写SQL才可以
重现步骤(如果有就写完整)
default关键字修饰的方法加注解@InterceptorIgnore( tenantLine = "true" )无法忽略租户拦截
@InterceptorIgnore( tenantLine = "true" )
default void select(Long id, String name) {
LambdaQueryWrapper
}
报错信息
无报错,租户拦截不生效
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
目前你只能走线程上下文的方式.