SpringMVC:拦截Mybatis的mapper

我们在使用mybatis的时候会碰到一些公共添加时间,操作人员,更新时间、或者一些分页这个使我们如果要去添加每个对应的- service - dao - mapper - xml 这样就造成很多冗余代码,那这个时候我们就需要使用一些通用方法,统一就行修改和赋值。

我们就需要使用到拦截,那我们如何拦截 Mybatis的mapper呢?

我们拦截mapper有两种方法:

1、使用@Aspect注解

要去使用jdk的代理,否则代理不了mapper(即mybatis代理的mapper没有默认的构造器,cglib无法再给这个代理构造代理,会报如下错误

org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.sun.proxy.$Proxy13]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy13)

那我们需要将对@Aspect支持修改为jdk代理

<!-- 启动对@Aspectj的支持 true为cglib,false为jdk代理,为true的话,会导致拦截不了mybatis的mapper-->
<aop:aspectj-autoproxy proxy-target-class="false" />

之后就是使用注解去配置拦截,进行修改记录的操作

@Aspect
@Component
public class DataLogAspect {private static final Logger logger = LoggerFactory.getLogger(DataLogAspect.class);@Resourceprivate ActionMapper actionMapper;@Pointcut("execution(public * com.kingbal.infrastructure.repository.mapper.*.insert*(..)) " +"&& !execution(public * com.kingbal.infrastructure.repository.mapper.ActionMapper.insert*(..))")public void insert(){}@Pointcut("execution(public * com.kingbal.infrastructure.repository.mapper.*.update*(..))")public void update(){}@Pointcut("execution(public * com.kingbal.infrastructure.repository.mapper.*.delete*(..))")public void delete(){}@Around("insert() || update() || delete()")public Object addOperateLog(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {...}
}
2、使用MethodInterceptor

 使用aopalliance的MethodInterceptor

(1)配置文件

        去掉对@Aspect注解的支持(也可以不去掉,只要不是proxy-target-class = true就可以)。然后配置aop

<bean id="dataLogInterceptor" class="com.kingbal.infrastructure.dataLog.dataLogInterceptor" />
<aop:config><aop:pointcut id="dataLogInsertPointCut" expression="execution(* com.kingbal.infrastructure.repository.mapper..insert*(..))&amp;&amp; !execution(* com.kingbal.infrastructure.repository.mapper.ActionMapper.*(..))" /><aop:pointcut id="dataLogUpdatePointCut" expression="execution(* com.kingbal.infrastructure.repository.mapper..update*(..)) &amp;&amp; !execution(* com.kingbal.infrastructure.repository.mapper.ActionMapper.*(..))" /><aop:pointcut id="dataLogDeletePointCut" expression="execution(* com.kingbal.infrastructure.repository.mapper..delete*(..)) &amp;&amp; !execution(* com.kingbal.infrastructure.repository.mapper.ActionMapper.*(..))" /><aop:advisor advice-ref="dataLogInterceptor" pointcut-ref="dataLogInsertPointCut" /><aop:advisor advice-ref="dataLogInterceptor" pointcut-ref="dataLogUpdatePointCut" /><aop:advisor advice-ref="dataLogInterceptor" pointcut-ref="dataLogDeletePointCut" />
</aop:config>

(2)实现MethodInterceptor

public class DataLogInterceptor implements MethodInterceptor{private static final Logger logger = LoggerFactory.getLogger(DataLogInterceptor.class);public DataLogInterceptor() {}@Resourceprivate ActionMapper actionMapper;@Overridepublic Object invoke(MethodInvocation methodInvocation) throws Throwable {Method method = methodInvocation.getMethod();String methodName = method.getName();Class<?> cls = method.getDeclaringClass();Object service = methodInvocation.getThis();Object[] args = methodInvocation.getArguments();Integer actionType = -1; ...}
}

推荐使用 @Aspect

注意事项

1、如果service层有实现接口,则在其他地方注入的时候必须使用接口声明,否则会报错

2、拦截mapper,如果使用注解@Aspect ,必须强制使用JDK代理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/30384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html中如何写一个提示框,css画一个提示框

在HTML中&#xff0c;提示框通常使用<div>元素来创建&#xff0c;然后使用CSS进行样式化。以下是一个示例&#xff0c;展示如何在HTML中写一个提示框&#xff0c;并使用CSS来设计其外观。 HTML 首先&#xff0c;创建一个HTML文件&#xff0c;其中包含一个提示框的结构&…

嵌套使用模板类

#include<iostream> using namespace std;template <class Datatype> class Stack { private:Datatype* items;//栈数组int stacksize;//栈的实际大小int top;//栈顶指针 public://构造函数&#xff1a;1&#xff09;分配栈数组内存&#xff0c;2&#xff09;把栈顶…

Shopee菲律宾本土店允许中途无理由退货,如何应对退货后库存混乱问题?

Shopee菲律宾本土店最近实施了一项新政策&#xff0c;自2024年6月10日起&#xff0c;允许买家在商品仍在运输途中申请退货与退款&#xff0c;此即“在途退货/退款”功能&#xff0c;主要的目的是为了提升买家的购物体验&#xff0c;增强市场竞争力。 图源&#xff1a;Shopee菲律…

一年前 LLM AGI 碎片化思考与回顾系列⑤ · 探索SystemⅡ复杂推理的未知之境

阅读提示&#xff1a; 本篇系列内容的是建立于自己过去一年在以LLM为代表的AIGC快速发展浪潮中结合学术界与产业界创新与进展的一些碎片化思考并记录最终沉淀完成&#xff0c;在内容上&#xff0c;与不久前刚刚完稿的那篇10万字文章 「融合RL与LLM思想&#xff0c;探寻世界模型…

vue3delete请求报403forbidden,前后端解决方式,cookie无效问题

在做开发时&#xff0c;前期已经在Controller类加上CrossOrigin(origins "*")&#xff0c;发送get和post请求都没问题&#xff0c;但遇到delete请求时&#xff0c;又报出跨域问题 一.前端添加proxy代理服务器&#xff08;未能解决&#xff09; 在vue.config.js中使…

C#面:abstract 的 method 是否可同时是 static,是否可同时是 native,是否可同时是 synchronized?

abstract 的方法不能同时是 static、native 或 synchronized。 static 方法是属于类的方法&#xff0c;而 abstract 方法是需要在子类中实现的方法&#xff0c;两者的概念相互矛盾。static 方法是在编译时就确定的&#xff0c;而abstract方法需要在运行时才能确定具体实现。na…

Qt多线程技术

Qt提供了许多处理线程的类和函数。下面是Qt程序员可以用来实现多线程应用程序的四种不同方法。 QThread:带有可选事件循环的低级API QThread是Qt中所有线程控制的基础&#xff0c;每个QThread实例代表并控制一个线程。 QThread既可以被直接实例化&#xff0c;也可以被子类化。…

连接Huggingface报requests.exceptions.SSLError错误

最近在学习使用 SHAP 算法解释 BERT 模型的输出结果&#xff0c;然而在从 Huggingface 上导入模型和数据集的过程中出现了网络连接相关的错误&#xff0c;本文用于记录错误类型和解决错误的方法。 1 代码示例 SHAP 官方展示的代码如下&#xff1a; import datasets import nu…

Linux screen命令使用

文章目录 1. 前言2. screen是什么?3. screen使用场景描述3. screen常用命令4. 小结5. 参考 1. 前言 实际开发中用到的云服务器&#xff0c;如果项目使用的是python&#xff0c;需要利用项目运行一些时间较长的项目程序脚本的话&#xff0c;由于我们通过ssh连接远端服务器&…

一文详解扩散模型

文章目录 1、常见的生成模型2、变分推断简介3、文生图的评价指标4、Diffusion Models5、其他技术交流群精选 节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地…

软设之进度管理之pert图

pert图 优点: 不仅给出了各个任务的开始时间&#xff0c;结束时间和完成该任务所需的时间&#xff0c;还给出了任务之间的关系&#xff0c;即哪些任务完成之后才能开始另外一些任务&#xff0c;以及如期完成整个工程的关键路径。松弛时间反映了某些任务是可以推迟其开始时间或…

2024年通信安全员ABC证证考试题库及通信安全员ABC证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年通信安全员ABC证证考试题库及通信安全员ABC证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大…

Spring Boot 开发 -- 常用加密算法简介(一)

在Spring Boot开发过程中&#xff0c;安全性始终是一个重要的考量因素。数据加密作为保护数据安全的一种有效手段&#xff0c;被广泛应用于各种应用场景中。本文将介绍几种在Spring Boot开发中常用的加密算法&#xff0c;并探讨它们的应用场景。 一、 对称加密算法 对称加密算…

项目3:从0开始的RPC框架(扩展版)-3

七. 负载均衡 1. 需求分析 目前我们的RPC框架仅允许消费者读取第一个服务提供者的服务节点&#xff0c;但在实际应用中&#xff0c;同一个服务会有多个服务提供者上传节点信息。如果消费者只读取第一个&#xff0c;势必会增大单个节点的压力&#xff0c;并且也浪费了其它节点…

Jenkins+K8s实现持续集成(一)

镜像仓库的搭建 docker run -d \--restartalways \--name registry \-p 5000:5000 \-v /root/devops/registry/data:/var/lib/registry \registry安装完之后&#xff0c;执行下面命令可以看到镜像仓库已经安装成功 docker ps 然后在浏览器上输入下面地址进行访问 http://ip:…

车牌号识别(低级版)

import cv2 from matplotlib import pyplot as plt import os import numpy as np from paddleocr import PaddleOCR, draw_ocr from PIL import Image, ImageDraw, ImageFont# 利用paddelOCR进行文字扫描&#xff0c;并输出结果 def text_scan(img_path):ocr PaddleOCR(use_a…

HTML(11)——CSS三大特性

CSS拥有三大特性&#xff0c;分别是&#xff1a;继承性&#xff0c;层叠性&#xff0c;优先级 继承性 说明&#xff1a;子级标签默认继承父级标签的文字控制属性。 如果子级自己有样式&#xff0c;则父级的属性不生效 例如&#xff1a; <style> body{ font-size:30px;…

C++之结构体初始化使用总结

1、前言 结构体是常用的自定义构造类型&#xff0c;是一种很常见的数据打包方法。如下所示为一典型的包含各种数据类型结构体Mystruct。其包括double、float、int、bool、vector<int>、char数据类型。因此&#xff0c;合理利用结构体&#xff0c;可以有效对数据进行组织&…

ADS1220芯片写寄存器失败

1&#xff09;场景&#xff1a;最近调试ADS1220 的芯片&#xff0c;需要读取不同通道的AD值&#xff0c;修改寄存器0的值时一直失败 但是在单片机启动时&#xff0c;写寄存器0时&#xff0c;值能正确写入&#xff0c;并正确读出&#xff0c;之后写完读取出的都是FF或其他异常值…

LIO-SAM调试记录

一、调试环境 室内环境。利用激光数据和imu数据进行建图&#xff0c;没有用gps数据。 二、调试问题 问题一&#xff1a; map坐标系和base_link坐标系一开始不重合。 解决方法&#xff1a; 将param.yaml文件中的useImuHeadingInitialization设置为false。 问题二&#xff1…