Spring AOP切面实现为mapper层指定方法入参字段赋值

需求:

        有时候我们在进行某些操作时,可能需要额外进行复制操作,而这些字段往往不是由前端/客户端填写输入的,而是由后端给与,类似于 登陆者、创建时间、更新时间等字段,这时,可以借助AOP指定mapper层(也可改为其它层)进行默认值赋予

package com.taia.yms.aop;import cn.hutool.core.util.ObjectUtil;
import com.taia.yms.util.ReflectionUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.lang.reflect.*;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 为 某些字段设置默认值,mapper层代码生成不利于做修改,针对配置的字段 及 方法进行动态设值*/
@Component
@Aspect
@Order(3)
public class MapperDefaultValueAspect {private static final Logger log = LoggerFactory.getLogger(MapperDefaultValueAspect.class);//key:方法名  value:字段+默认值private static final Map<String,Map<String,Object>> MAP = new HashMap<>(10);//公共字段 mapprivate static final Map<String,Object> COMMON_COLUMN_VALUE_MAP = new HashMap<>(10);//指定方法mapprivate static final Map<String,Object> INSERT_COLUMN_VALUE_MAP = new HashMap<>(10);static {//公共字段COMMON_COLUMN_VALUE_MAP.put("status","1");COMMON_COLUMN_VALUE_MAP.put("lastUpdatedTime",new Timestamp(System.currentTimeMillis()));INSERT_COLUMN_VALUE_MAP.put("createdTime",new Timestamp(System.currentTimeMillis()));INSERT_COLUMN_VALUE_MAP.putAll(COMMON_COLUMN_VALUE_MAP);MAP.put("insert",INSERT_COLUMN_VALUE_MAP);MAP.put("updateByPrimaryKey",COMMON_COLUMN_VALUE_MAP);}//定义pointcut签名@Pointcut("execution(* com.taia.yms.mapper.*.*(..))")private void pointCut() {//方法为空,仅做签名}//对切点方法进行前置增强,就是在调用切点方法前进行做一些必要的操作,这就成为增强@Before("pointCut()")public void getRes(JoinPoint joinPoint) throws Throwable {log.info("开始拦截。。。");// 获取方法签名Signature signature = joinPoint.getSignature();MethodSignature methodSignature = (MethodSignature) signature;Method method = methodSignature.getMethod();// 获取方法名String currentMethodName = method.getName();if(!MAP.containsKey(currentMethodName)){return;}Map<String, Object> map = MAP.get(currentMethodName);if(map == null){return;}Object[] objects = joinPoint.getArgs();Parameter[] parameters = method.getParameters();if(parameters == null){return;}for (int j = 0; j < objects.length; j++) {Object arg = objects[j];Class<?> aClass = arg.getClass();List<Field> allFields = ReflectionUtils.getAllFields(aClass);for (Field field: allFields) {//设置对象的访问权限,保证对private的属性的访问field.setAccessible(true);Object value = field.get(arg);//设置默认值if(map.containsKey(field.getName()) && ObjectUtil.isEmpty(value)){field.set(arg,map.get(field.getName()));}}}}}
package com.taia.yms.util;import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;public class ReflectionUtils {/*** 获取某个类的所有属性  包含父类* @param clazz* @return*/public static List<Field> getAllFields(Class<?> clazz) {List<Field> fieldList = new ArrayList<>();Class<?> superclass = clazz;// 循环直到Object类,因为Object类是所有类的根类while (superclass != null && !Object.class.equals(superclass)) {// 获取该类声明的所有字段(包括私有字段)Field[] fields = superclass.getDeclaredFields();for (Field field : fields) {fieldList.add(field);}// 递归获取父类的字段superclass = superclass.getSuperclass();}return fieldList;}
}

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

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

相关文章

强化学习——马尔可夫奖励过程的理解

目录 一、马尔可夫奖励过程1.回报2.价值函数 参考文献 一、马尔可夫奖励过程 在马尔可夫过程的基础上加入奖励函数 r r r 和折扣因子 γ \gamma γ&#xff0c;就可以得到马尔可夫奖励过程&#xff08;Markov reward process&#xff09;。一个马尔可夫奖励过程由 < S , …

Vue从入门到实战Day05

一、自定义指令 自定义指令&#xff1a;自己定义的指令&#xff0c;可以封装一些dom操作&#xff0c;扩展额外功能 需求&#xff1a;当页面加载时&#xff0c;让元素将获得焦点 (autofocus在safari浏览器有兼容性) 操作dom&#xff1a;dom元素.focus() mounted() {this.$ref…

安装和配置OceanBase

安装和配置OceanBase 下面是安装和配置OceanBase&#xff08;jieyiobs集群&#xff09;的步骤&#xff1a; 1. 安装YUM工具&#xff08;如果尚未安装&#xff09; yum install -y yum-utils2. 添加OceanBase仓库 为了能从OceanBase的官方源安装软件&#xff0c;需要添加它的…

(delphi11最新学习资料) Object Pascal 学习笔记---第12章操作类(类方法和类数据)

第12章 操作类 ​ 在过去的几章中&#xff0c;你已经了解了 Object Pascal 语言面向对象的基础&#xff1a;类、对象、方法、构造函数、继承、后期绑定、接口等等。现在&#xff0c;我们需要进一步了解与类管理相关的一些更高级、更具体的语言特性。从类引用到类助手(class he…

Elasticsearch解决字段膨胀问题

文章目录 背景Flattened类型的产生Flattened类型的定义基于Flattened类型插入数据更新Flattened字段并添加数据Flattened类型检索 Flattened类型的不足 背景 Elasticsearch映射如果不进行特殊设置&#xff0c;则默认为dynamic:true。dynamic:true实际上支持不加约束地动态添加…

关于milvus go sdk运行时报9223372036854775807 (untvped int constant)overflows int问题

背景 在使用milvus go sdk去查询milvus服务中并列出所有集合的时候遇到一个int溢出问题&#xff0c;依据官方文档&#xff0c;具体代码如下 package localimport ("context""fmt""github.com/milvus-io/milvus-sdk-go/v2/client""log&quo…

vue3使用依赖注入实现跨组件传值

父组件Index.vue: <script setup> import { onMounted, provide, ref } from vue import Child from ./Child.vue import ./index.cssconst count ref(0)provide(count, count)const handleClick () > {count.value }onMounted(() > {}) </script><tem…

spring boot常用的filter

OrderedCharacterEncodingFilter 由 HttpEncodingAutoConfiguration 注入 BeanConditionalOnMissingBeanpublic CharacterEncodingFilter characterEncodingFilter() {CharacterEncodingFilter filter new OrderedCharacterEncodingFilter();filter.setEncoding(this.propert…

ES6之字符串的扩展

字符串的扩展 关键的扩展点及其示例&#xff1a; Unicode 表示与处理 JavaScript 共有6种方法可以表示一个字符。codePointAtpos&#xff1a;String.fromCodePoint…codePoints&#xff1a; **字符串的遍历 for … of **字符串方法的增强 includessearchString[, position]&…

记录:robot_localization传感器数据融合学习

一、参考资料 官方&#xff1a; http://wiki.ros.org/robot_localizationhttp://docs.ros.org/en/noetic/api/robot_localization/html/index.html2015 ROSCon 演讲官方网址&#xff08;youyube上也有这个视频&#xff09; 实践教程 https://kapernikov.com/the-ros-robot_…

纯福利|手把手教你如何白嫖免费的GPU资源(二)

大家好&#xff0c;我是无界生长。 前段时间写过一篇文章《纯福利&#xff5c;手把手教你如何白嫖免费的GPU资源&#xff08;一&#xff09;》&#xff0c;使用Google Colab提供的免费的GPU资源&#xff0c;今天接着写白嫖GPU资源攻略&#xff0c;可获得“长期免费的CPU实例资源…

【opencv】信用卡号识别实验

实验环境&#xff1a;anaconda、jupyter notebook&#xff08;其它的ide也行&#xff09; 实验用的包&#xff1a;numpy、matplotlib、opencv 实验目标&#xff1a; 识别信用卡的卡号 信用卡图片&#xff1a; 数字模板图片&#xff1a; 一、包引入 import cv2 import matplo…

kubernetes集群svc的代理模式-iptables修改为ipvs

一、概述\ 我们都知道&#xff0c;k8s集群的外部网络分发&#xff0c;借助kube-proxy组件来完成&#xff1b; 问题&#xff1a;我们为什么要将代理模式修改为ipvs而不继续使用iptables呐&#xff1f; 1&#xff0c;iptables底层使用四表五链完成网络代理&#xff0c;效率比较低…

RiProV2主题美化【支付页弹窗增加价格提示语】Ritheme主题美化RiProV2-网站WordPress美化二开

背景: 楼主的网站是用WordPress搭建的,并使用了正版主题RiProV2,但RiProV2在支付弹窗页没有价格,只在文章详情页会展示价格。本文就是美化这个支付弹窗,在支付弹窗页把价格字段加上,如下图所示: 美化前: 美化后 美化步骤: (1)定位到文件:/www/wwwroot/www.uu2i…

基于SpringBoot设计模式之创建型设计模式·抽象工厂模式

文章目录 介绍开始架构图&#xff08;以穿搭举例&#xff09;样例一&#xff08;html关于列表和表格的应用&#xff09;定义抽象工厂&#xff08;html&#xff09;定义抽象工厂需要制作抽象产物&#xff08;托盘&#xff09;定义具体工厂&#xff08;列表、表格&#xff09;定义…

海洋环境保护论文阅读记录

海洋环境保护 论文1&#xff1a;Critical role of wave–seabed interactions in the extensive erosion of Yellow River estuarine sediments 波浪-海床相互作用在黄河河口广泛侵中的关键作用 estuatine 河口的&#xff0c;港湾的 erodibility侵蚀度 sediment erodibility …

【Golang】Golang 的 HTTP 使用 Header 指南

文章目录 前言一、Header 解释二、代码实现三、hearder常见枚举值四、总结 前言 在构建和处理 HTTP 请求和响应时&#xff0c;Headers 扮演着重要的角色。它们提供了关于请求或响应的元数据&#xff0c;例如内容类型&#xff0c;编码&#xff0c;认证等。在 Go 语言中&#xf…

[PythonWeb:Django框架]:前后端请求调用;

文章目录 接着上篇项目app包下面创建static包&#xff0c;引入jquery&#xff0c;bootstrap 相关js文件views.py编写apicompute文件夹下面的urls.py路由模块引入views.py刚刚定义的函数html发送ajax请求 接着上篇 https://blog.csdn.net/Abraxs/article/details/138739727?sp…

24年湖南三支一扶报名详细流程(电脑报名)

24年湖南三支一扶报名详细流程&#xff08;电脑报名&#xff09; #湖南三支一扶 #湖南三支一扶考试 #三支一扶报名照片 #三支一扶考试 #三支一扶 #湖南省三支一扶