当前位置: 代码网 > it编程>数据库>Redis > Redis与自定义注解实现重复方式

Redis与自定义注解实现重复方式

2025年12月11日 Redis 我要评论
1、创建submitlock 注解@target(elementtype.method)@retention(retentionpolicy.runtime)public @interface sub

1、创建 submitlock 注解

@target(elementtype.method)
@retention(retentionpolicy.runtime)
public @interface submitlock {
    string key() default "";
}

2、注解实现

    @autowired
    public redisutils redisutils;

    @around("execution(* com.example.code_generation..*controller.*(..)) && @annotation(lock)")
    public object submitinterceptor(proceedingjoinpoint pjp, submitlock lock) {
        servletrequestattributes attributes = (servletrequestattributes) requestcontextholder.getrequestattributes();

        httpservletrequest request = attributes.getrequest();

        string uri = request.getrequesturi();
        methodsignature signature = (methodsignature) pjp.getsignature();
        method method = signature.getmethod();
        //真实类名字
        string targetname = pjp.gettarget().getclass().getname();
        //真实方式
        string methodname = pjp.getsignature().getname();
        //所有的请求参数
        object[] arguments = pjp.getargs();
        object[] args = new object[arguments.length];
        submitlock locallock = method.getannotation(submitlock.class);
        string key = setkey(locallock.key(), pjp.getargs());

        if (!stringutils.isempty(key)) {
            if (redisutils.get(key) != null) {
                log.error("请勿重复操作,uri = 【{}】", uri);
                return new rspdata<>(bizcodeenum.warn, "请勿重复操作");
            }
            redisutils.set(key,key,2);
        }
        object result = null;
        try {
            result = pjp.proceed();
            return result;
        }catch (throwable throwable){
            throw new runtimeexception("服务器异常");
        }finally {
            int order = 0;
            for (object arg : arguments){
                if (arg instanceof servletrequest || arg instanceof servletresponse || arg instanceof multipartfile){
                    continue;
                }
                args[order] = arg;
                order ++ ;
            }
            log.info("调用controller方法返回结果,targetname = {}, methodname = {}, args = {}, result = {}",
                    targetname, methodname, args, result);
        }

    }


    private string setkey(string keyexpress, object[] args) {
        if (null != args && args.length > 0) {
            keyexpress = keyexpress.replace("arg[0]", args[0].tostring());
        }
        return keyexpress;
    }

3、controller 测试验证

    @submitlock(key = "gettest")
    @apioperation(value = "获取代办任务")
    @getmapping("gettest")
    public object gettest(@currentuser userinfo userinfo) {
        
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com