环绕方法,可自定义目标方法执行的时机
这个方法的目的是,对用户进行删除时,需要记录谁删掉了谁,如果直接使用环绕切面进行记录日志的话,执行顺序是先进入切面,那到对应的信息后会去执行方法,将用户删除完成后再去写表的操作。这里会出现一个问题,我的用户数据是存在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;
}