自定义注解使用SPEL表达式绑定动态变量参数值
1、定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OperationLog {
String module();
String operation();
String businessId() default "";
}
2、定义AOP
@Service
@Aspect
public class OperationLogAop {
@After("@annotation(operationLog)")
public void interceptOperation(JoinPoint point, OperationLog operationLog) {
String module = operationLog.module();
String operation = operationLog.operation();
String businessIdSpel = operationLog.businessId();
Object[] args = point.getArgs();
Method method = ((MethodSignature) point.getSignature()).getMethod();
//获取被拦截方法参数名列表(使用Spring支持类库)
LocalVariableTableParameterNameDiscoverer localVariableTable = new LocalVariableTableParameterNameDiscoverer();
String[] paraNameArr = localVariableTable.getParameterNames(method);
//使用SPEL进行key的解析
ExpressionParser parser = new SpelExpressionParser();
//SPEL上下文
StandardEvaluationContext context = new StandardEvaluationContext();
//把方法参数放入SPEL上下文中
for(int i=0;i<paraNameArr.length;i++) {
context.setVariable(paraNameArr[i], args[i]);
}
String businessId = null;
// 使用变量方式传入业务动态数据
if(businessIdSpel.matches("^#.*.$")) {
businessId = parser.parseExpression(businessIdSpel).getValue(context, String.class);
}
System.out.println(businessId);
}
}
3、使用注解
@OperationLog(module = "role", operation = "insert", businessId = "#entity.name")
@PostMapping("/insert")
public void insert(Role entity) {
}
本文由 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为: 2021/03/25 04:23