spring boot异步方式参数失效

首先说明这篇文章没有解决办法

背景

用spring boot aop添加操作日,为了给前端更快的返回结果,日志操作用了异步方式

问题

为了获取请求地址,调用异步方法会把request传过去,有时候这里

 String url = request.getRequestURL().toString();

会报空指针异常
aop方法代码:

@AfterReturning(returning = "result", pointcut = "log()")
    public void doAfterReturning(Result result) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes != null) {
            HttpServletRequest request = attributes.getRequest();
            System.out.println("+++++++++++++++++++++++");
            System.out.println(request.getRequestURL().toString());
            System.out.println("+++++++++++++++++++++++");
            operationUtil.operationRedis(request, result);
        }
        System.out.println("执行时间: " + (System.currentTimeMillis() - startTime.get()) + "ms");
        startTime.remove();
    }

异步方法代码:

 @Async
    public void operationRedis(HttpServletRequest request, Result result) {
        System.out.println("========================");
        System.out.println(request.getRequestURL().toString());
        System.out.println("========================");
        String ip = GetIp.getIpAddress(request);
        String url = request.getRequestURL().toString();
        url = url.substring(url.lastIndexOf("/") + 1);
        if (DELETE.equals(url) || UPDATE.equals(url) || CREATE.equals(url)) {
            JSONObject user = JSON.parseObject(request.getParameter("tokenUser"));
            Operation operation = new Operation(null, result.getLogs(), null, LocalDateTime.now(), ip, (Integer) user.get("id"), (Integer) user.get("companyId"), (String) user.get("name"));
            switch (url) {
                case DELETE:
                    operation.setType(OperationEnum.DELETE.value());
                    break;
                case UPDATE:
                    operation.setType(OperationEnum.UPDATE.value());
                    break;
                case CREATE:
                    operation.setType(OperationEnum.CREATE.value());
                    break;
                default:
                    break;
            }
            redisTemplate.opsForList().rightPush(operationRedisKey, operation);
        }
        //如果redis中的操作记录数量大于2000就立刻写入数据库
        if (redisTemplate.opsForList().size(operationRedisKey) > MAX_LIST) {
            operationPersistence();
        }
    }

报错:
在这里插入图片描述

原因

个人猜测是aop方法执行完后 jvm 就把 request 回收了,导致异步方法里的 request
值为空

验证

在这里插入图片描述
在异步方法里面先睡眠2秒,在调用方法,发现每次都会抛出空指针异常

解决

还没想到。。。emmm

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值