环绕方法,可自定义目标方法执行的时机

博客介绍了Java环绕方法可自定义目标方法执行时机。在用户删除操作中,若用环绕切面记录日志,直接操作会有问题,因MongoDB存储用户数据,成功删除后只有id无name。故先写表再删用户信息,删除失败则进入catch删除日志。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环绕方法,可自定义目标方法执行的时机

这个方法的目的是,对用户进行删除时,需要记录谁删掉了谁,如果直接使用环绕切面进行记录日志的话,执行顺序是先进入切面,那到对应的信息后会去执行方法,将用户删除完成后再去写表的操作。这里会出现一个问题,我的用户数据是存在MongoDB中的,如果用户成功删除后,我只有用户的id,无法知道用户的name。所以我在删除用户信息后,先认为他是成功的,将其信息写入到表中,再删除用户信息。但是,当用户删除失败后,会进入到caatch,异常通知,那就将这条日志给删除

 public List<Integer> saveDeleteUserLog(){
        List<Integer> ids = new ArrayList<>();
                ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = null;
        if (attributes != null) {
            request = attributes.getRequest();
        }
        Result<Map<String, String>> loginUserInfo = apiUtil.getLoginUserInfo(request);

            String userids = request.getParameter("userids");
            String[] split = userids.split(",");
            if (split.length >= 1) {
                for (int i = 0; i < split.length; i++) {
                    UserLogPo userLogPo = new UserLogPo();
                    userLogPo.setByusernameid(split[i]);
                    Result<String> userName = userService.getUserName(split[i]);
                    if (loginUserInfo.successful()) {
                        userLogPo.setCreateuserid(loginUserInfo.getResult().get("userid"));
                        userLogPo.setCreateusername(loginUserInfo.getResult().get(UserProperty.username));
                    }
                    userLogPo.setType("删除");
                    userLogPo.setByusernamename(userName.getResult());
                    userLogPo.setIp(WebLogAspect.getClientIp(request));
                    userLogPo.setCreatetime(new DateTime());
                    userLogDao.insert(userLogPo);
                    ids.add(userLogPo.getId());
                }
            } else {
                UserLogPo userLogPo = new UserLogPo();
                userLogPo.setType("删除");
                userLogPo.setByusernameid(null);
                userLogPo.setByusernamename(null);
                if (loginUserInfo.successful()) {
                    userLogPo.setCreateuserid(loginUserInfo.getResult().get("userid"));
                    userLogPo.setCreateusername(loginUserInfo.getResult().get(UserProperty.username));
                }
                userLogPo.setIp(WebLogAspect.getClientIp(request));
                userLogPo.setCreatetime(new DateTime());
                userLogDao.insert(userLogPo);
                ids.add(userLogPo.getId());
            }

        return ids;

    }

本文重点:

 	//环绕通知:注解的含义是定义userservlet类下面的delete方法
	@Around("execution(* com.commnetsoft.dri.control.v1.admin.UserServlet.delete(..))")
    public Object aroundMethodsa(ProceedingJoinPoint pjd){
        Object result = null;
        List<Integer> userLogId = new ArrayList<>();
        try {
            //前置通知
            System.out.println("目标方法执行前...");
            //将要删除的用户数据信息保存起来
            List<Integer> saveDeleteUserLog = saveDeleteUserLog();
            userLogId= before;
  
            //执行目标方法
            result = pjd.proceed();
            //返回通知
            System.out.println("目标方法返回结果后...");
        } catch (Throwable e) {
            //异常通知
            System.out.println("执行目标方法异常后...");
            //如果删除失败,将这条删除日志删掉
            if (CollectionUtil.isNotEmpty(userLogId)){
                userLogDao.deleteByIdList(userLogId);
            }
            throw new RuntimeException(e);

        }
        //后置通知
        System.out.println("目标方法执行后...");

        return result;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值