自定义注解使用SPEL表达式记录日志

一、SPEL表达式

SPEL(Spring Expression Language)即Spring表达式语言,它是一种类似jsp的EL表达式,但是又比后者更强大的表达式语言。

例如,经常使用的@Value注解,比如:

@Value("${saas.baseUrl}")
private String baseUrl;

其中参数可以为常量字符串,如:@Value("https://a.valueonline.cn/")

也可以为#{},在大括号类可以为bena的属性、环境变量,

也可以为properties@Value("{saas.baseUrl}")

二、自定义注解,

我们的目的是需要记录操作的日志,需要具体到某个业务,所以业务的id为动态变化的,如果在每个业务代码里面加入日志会使得业务代码变得更为复杂,所以我们需要自定义注解并且配合使用SPEL表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IrLog {
 
    /**
     * 模块名称
     */
    ModuleType moduleType();
 
    /**
     * 关联业务主键
     */
    String businessId() default "";
 
    /**
     * 日志内容
     */
    String content() default "";
 
    enum ModuleType {
        BASE_INFO("基本信息", "01"),
 
        LAW_FILE("相关文件", "02"),
 
        ;
 
        private final String moduleName;
 
        private final String moduleValue;
 
        ModuleType(String moduleName, String moduleValue) {
            this.moduleName = moduleName;
            this.moduleValue = moduleValue;
        }
 
        public String getModuleName() {
            return moduleName;
        }
 
        public String getModuleValue() {
            return moduleValue;
        }
    }
}

 三、日志切面类

复制代码
@Aspect
@Component
public class IrLogAspect  {

    private static Logger logger = LoggerFactory.getLogger(IrLogAspect.class);

    private final ExpressionParser expressionParser = new SpelExpressionParser();

    private DefaultParameterNameDiscoverer nameDiscoverer = new DefaultParameterNameDiscoverer();




    @Around("@annotation(log)")
    public Object invoked(ProceedingJoinPoint joinPoint, IrLog log) throws Throwable {
        String businessId = log.businessId();
        String moduleValue = log.moduleType().getModuleValue();
        String content = log.content();
        Log logDto = new Log();

        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        Method method = methodSignature.getMethod();
        String[] paramNames = nameDiscoverer.getParameterNames(method);

        Expression expression = expressionParser.parseExpression(businessId);
        EvaluationContext context = new StandardEvaluationContext();
        Object[] args = joinPoint.getArgs();
        for (int i = 0 ; i < args.length ; i++) {
            context.setVariable(paramNames[i], args[i]);
        }

        String parseBusinessId = expression.getValue(context, String.class);


//            logger.info("businessId: {}, moduleValue: {}, dbTime: {}", parseBusinessId, moduleValue, dbTime);
        

        return joinPoint.proceed();
    }

}
复制代码

使用:

   @PostMapping("/issueRegulations")
    @IrLog(moduleType = IrLog.ModuleType.PUBLISH, businessId = "#regulationsId")
    public void issueRegulations(String regulationsId) {
        
    }

 

posted @   木马不是马  阅读(1385)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示