mybatisPlus拦截sql失败----已解决

news/2025/1/8 12:36:26/

1. 在使用MybatisPlusInterceptor想对数据权限做限制,但是发现使用寻常的配置,在执行sql后也不会被拦截 代码如下:

@Configuration public class MybatisPlusConfig { public MybatisPlusInterceptor setMybatisPlusInterceptor(){ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new DataPermissionInterceptor(new MyDataPermissionHandler())); return interceptor; }
}

执行sql语句后拦截器没有反应

@Slf4j
public class MyDataPermissionHandler implements DataPermissionHandler {@Override@SneakyThrowspublic Expression getSqlSegment(Expression where, String mappedStatementId) {// 超级管理员不受数据权限控制Class<?> clazz = Class.forName(mappedStatementId.substring(0, mappedStatementId.lastIndexOf(StringPool.DOT)));String methodName = mappedStatementId.substring(mappedStatementId.lastIndexOf(StringPool.DOT) + 1);Method[] methods = clazz.getDeclaredMethods();for (Method method : methods) {DataPermission annotation = method.getAnnotation(DataPermission.class);if (ObjectUtils.isNotEmpty(annotation)&& (method.getName().equals(methodName) || (method.getName() + "_COUNT").equals(methodName))) {return dataScopeFilter(annotation.dataScope(), annotation.deptAlias(), annotation.deptIdColumnName(), annotation.userAlias(), annotation.userIdColumnName(), where);}}return where;}/*** 构建过滤条件** @param where 当前查询条件* @return 构建后查询条件*/@SneakyThrowspublic static Expression dataScopeFilter(DataPermissionEnum dataScopeEnum, String deptAlias, String deptIdColumnName, String userAlias, String userIdColumnName, Expression where) {String deptColumnName = StrUtil.isNotBlank(deptAlias) ? (deptAlias + StringPool.DOT + deptIdColumnName) : deptIdColumnName;String userColumnName = StrUtil.isNotBlank(userAlias) ? (userAlias + StringPool.DOT + userIdColumnName) : userIdColumnName;TspUserInfo tspUserInfo = ThreadContext.getSubject();if (dataScopeEnum == null) {String dataPermission = tspUserInfo.getDataPermission();// 获取当前用户的数据权限dataScopeEnum = DataPermissionEnum.getByCode(dataPermission);}//部门ID 包含多个部门,同一个用户的部门来源于用户组String orgCode = tspUserInfo.getOrgCode();String userId = tspUserInfo.getUserId();String acctOrgCode = tspUserInfo.getAcctOrgCode();List<String> dataPermissionOrgCodes = tspUserInfo.getDataPermissionOrgCodes();String appendSqlStr;switch (Objects.requireNonNull(dataScopeEnum)) {case Org:
//                appendSqlStr = deptColumnName + " in (" + orgCode + ")";appendSqlStr = deptColumnName + StringPool.EQUALS + orgCode;break;case Personal:appendSqlStr = userColumnName + StringPool.EQUALS + userId;break;case AcctOrg:appendSqlStr = userColumnName + StringPool.EQUALS + acctOrgCode;break;// 默认部门及子部门数据权限default:appendSqlStr = deptColumnName + " in (" + String.join(",", dataPermissionOrgCodes) + ")";break;}if (StrUtil.isBlank(appendSqlStr)) {return where;}Expression appendExpression = CCJSqlParserUtil.parseCondExpression(appendSqlStr);if (where == null) {return appendExpression;}return new AndExpression(where, appendExpression);}}

2. 就认为是拦截器没有起作用,后面同事大哥给了一个解决方法

@Slf4j
public class SqlSessionFactoryBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof SqlSessionFactory) { //所有bean初始化之后都会进入这个方法,这个时候需要滤出需要的类型,比如这次就只需要拿到SqlSessionFactory类型的对象对其设置拦截器就行了SqlSessionFactory nowBean = (SqlSessionFactory) bean;nowBean.getConfiguration().addInterceptor(new RowVersionUpdateInterceptor());nowBean.getConfiguration().addInterceptor(setMybatisPlusInterceptor());}return bean; //完成后返回出去,可能直接进入容器,也可能会去执行其他的BeanPostProcessor}public MybatisPlusInterceptor setMybatisPlusInterceptor(){MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new DataPermissionInterceptor(new MyDataPermissionHandler()));return interceptor;}
}

直接在注册Bean的时候,将SqlSessionFactory相关的bean都加上拦截器,然后再把SqlSessionFactoryBeanPostProcessor 注册到ioc中

@Configuration
public class MybatisPlusConfig {@Beanpublic SqlSessionFactoryBeanPostProcessor sqlSessionFactoryBeanPostProcessor() {return new SqlSessionFactoryBeanPostProcessor();}
}

3.可以解决问题,但是又不知道这个问题出在哪里,因为我之前都是这样配的,且重新搭建一个新的环境按照原来的方法依然可以,等我了解后问题,在来加更。。。。。。


http://www.ppmy.cn/news/1561552.html

相关文章

SQL使用视图

本文将介绍什么是视图&#xff0c;它们怎样工作&#xff0c;何时使用它们。 1. 视图 视图是虚拟的表。与包含数据的表不一样&#xff0c;视图只包含使用时动态检索数据的查询。 说明&#xff1a;SQLite 的视图 SQLite 仅支持只读视图&#xff0c;所以视图可以创建&#xff…

如何很快将文件转换成另外一种编码格式?编码?按指定编码格式编译?如何检测文件编码格式?Java .class文件编码和JVM运行期内存编码?

如何很快将文件转换成另外一种编码格式? 利用VS Code右下角的"选择编码"功能&#xff0c;选择"通过编码保存"可以很方便将文件转换成另外一种编码格式。尤其&#xff0c;在测试w/ BOM或w/o BOM, 或者ANSI编码和UTF编码转换&#xff0c;特别方便。VS文件另…

CSS语言的多线程编程

CSS语言的多线程编程探讨 1. 引言 在现代前端开发中&#xff0c;CSS&#xff08;层叠样式表&#xff09;已经成为了网页设计中不可或缺的重要组成部分。它不仅负责网页的外观和布局&#xff0c;还通过各种工具和框架扩展了其功能和特性。然而&#xff0c;随着网页复杂度的提升…

Java 日期时间格式化标准

文章目录 Java日期时间格式化符号ISO 8601中的日期时间ISO 8601标准的定义ISO 8601日期时间格式 周数年份ISO 8601中的周数年份Java中的周数年份 Java跨年日期格式化BUG注意事项 Java日期时间格式化符号 JDK官网截图&#xff1a; 格式化符号梳理&#xff1a; 符号描述符号用…

git撤回提交、删除远端某版本、合并指定版本的更改

撤回提交 vscode的举例 一、只提交了还未推送的情况下 1.撤回最后一次提交&#xff0c;把最后一次提交的更改放到暂存区 git reset --soft HEAD~12.撤回最后一次提交&#xff0c;把最后一次提交的更改放到工作区 git reset --mixed HEAD~13.撤回最后一次提交&#xff0c;不…

香橙派安装 opencv 4.9.0

香橙派Orange AI Pro / 华为昇腾310 使用源码方式安装opencv 4.9.0 下载源码到香橙派 https://opencv.org/releases/ 解压 unzip opencv-4.9.0.zip1代码解读 进入解压后的文件 cd opencv-4.9.01代码解读 创建构建目录build mkdir build1代码解读 进入目录 cd build1代码解读 使…

【Axure高保真原型】曲线面积图组

今天和大家分享曲线面积图组的原型模板&#xff0c;鼠标移入对应区域&#xff0c;会显示具体数据&#xff0c;这个原型模板是用Axure原生元件制作的&#xff0c;所以不需要联网或调用接口&#xff0c;具体效果可以打开下方原型地址体验或者点击下方视频观看 【原型效果】 【Ax…

OpenCV轮廓相关操作API (C++)

在OpenCV中&#xff0c;轮廓&#xff08;contours&#xff09;是图像处理中的一个重要概念&#xff0c;通常用于形状分析、物体检测等任务。OpenCV提供了多种与轮廓相关的API&#xff0c;可以在C中使用。 一.常用的与轮廓相关的操作及其对应的API函数 1.查找轮廓 findContou…