举例实现修改或者新增时给实体添加操作人信息
import java.lang.annotation.*;
/**
* 修改或者添加对象的操作人信息修改
*
* @Author qinlei
* @email qlanto_147@163.com
* @Date 2019年4月24日
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface InjectRealName {
/**
* 传参对象Class
* 默认 传参实体class类
* @return
*/
Class value() ;
/**
* 方法类型
* 0 保存 1 修改
* @return
*/
int method() ;
}
下面切面类 未作信息的非空,参数等的判定
import org.apache.shiro.SecurityUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.jeecg.common.system.vo.LoginUser;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 添加修改操作人信息添加,切面处理类
*
* @Author qinlei
* @email qlanto_147@163.com
* @Date 2020年4月24日
*/
@Aspect
@Component
public class InjectRealNameAspect {
@Pointcut("@annotation(*.*.InjectRealName)")//InjectRealName的包路径
public void injectPointCut() {
}
@Around("injectPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
//获取调用方法传入的参数
Object[] args = point.getArgs();
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
InjectRealName injectRealName = method.getAnnotation(InjectRealName.class);
//第一个参数
//第一个参数必须是需要操作的实体类
int methodType = injectRealName.method();
//通过shiro获取当前操作人信息
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
if(methodType == 0){
setPrivateField(args[0],"createBy",sysUser.getRealname());
}else{
setPrivateField(args[0],"updateBy",sysUser.getRealname());
}
//执行方法
Object result = point.proceed();
return result;
}
/**
* 通过反射的方式 设置私有成员的值
* @param instance 实体对象
* @param fieldName 私有属性名称
* @param value 需要注入的值
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
private void setPrivateField(Object instance, String fieldName, Object value) throws NoSuchFieldException, IllegalAccessException {
Field field = instance.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
field.set(instance, value);
}
}
测试调用
/**
* 添加
*
* @param Duty
* @return
*/
@InjectRealName(value = Duty.class,method = 0)
@PostMapping(value = "/add")
public Result<?> add(@RequestBody Duty duty) {
dutyService.save(duty);
return Result.ok("添加成功!");
}