写点什么

spring-boot-route 使用 aop 记录操作日志,springboot 入门项目实战

用户头像
极客good
关注
发布于: 刚刚

// 配置织入点


@Pointcut("@annotation(com.javatrip.aop.annotation.Log)")


public void logPointCut() {}


/**


  • 处理完请求后执行

  • @param joinPoint 切点


*/


@AfterReturning(pointcut = "logPointCut()", returning = "jsonResult")


public void doAfterReturning(JoinPoint joinPoint, Object jsonResult) {


handleLog(joinPoint, null, jsonResult);


}


/**


  • 拦截异常操作

  • @param joinPoint 切点

  • @param e 异常


*/


@AfterThrowing(value = "logPointCut()", throwing = "e")


public void doAfterThrowing(JoinPoint joinPoint, Exception e) {


handleLog(joinPoint, e, null);


}


protected void handleLog(final JoinPoint joinPoint, final Exception e, Object jsonResult) {


try {


// 获得注解


Log controllerLog = getAnnotationLog(joinPoint);


if (controllerLog == null) {


return;


}


SysOperLog operLog = new SysOperLog();


operLog.setStatus(0);


if (e != null) {


operLog.setStatus(1);


operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000));


}


// 设置方法名称


String className = joinPoint.getTarget().getClass().getName();


String methodName = joinPoint.getSignature().getName();


operLog.setMethod(className + "." + methodName + "()");


// 处理设置注解上的参数


getControllerMethodDescription(joinPoint, controllerLog, operLog);


// 保存数据库


asyncLogService.saveSysLog(operLog);


} catch (Exception exp) {


log.error("==前置通知异常==");


log.error("日志异常信息 {}", exp);


}


}


/**


  • 获取注解中对方法的描述信息 用于 Controller 层注解

  • @param log 日志

  • @param operLog 操作日志

  • @throws Exception


*/


public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog) {


// 设置 action 动作


operLog.setBusinessType(log.businessType().ordinal());


// 设置标题


operLog.setTitle(log.title());


}


/**


  • 是否存在注解,如果存在就获取


*/


private Log getAnnotationLog(JoinPoint joinPoint) {


Signature signature = joinPoint.getSignature();


MethodSignature methodSignature = (MethodSignature) signature;


Method method = methodSignature.getMethod();


if (method != null) {


return method.getAnnotation(Log.class);


}


return null;


}


}


操作类型的枚举类:


public enum BusinessType {


/**


  • 其它


*/


OTHER,


/**


  • 新增


*/


INSERT,


/**


  • 修改


*/


UPDATE,


/**


  • 删除


*/


DELETE,


}


使用 异步 方法将操作日志存库,为了方便我直接使用 jdbcTemplate 在 service 中进行存库操作。


@Service


public class AsyncLogService {


@Autowired


private JdbcTemplate jdbcTemplate;


/**


  • 保存系统日志记录


*/


@Async


public void saveSysLog(SysOperLog log) {


String sql = "INSERT INTO sys_oper_log(title,business_type,method,STATUS,error_msg,oper_time) VALUES(?,?,?,?,?,?)";


jdbcTemplate.update(sql,new Object[]{log.getTitle(),log.getBusinessType(),log.getMethod(),log.getStatus(),log.getErrorMsg(),new Date()});


}


}


[](


)三 编写接口测试


============================================================================


将自定义注解写在业务方法上,测试效果


@RestController


@RequestMapping("person")


public class PersonController {


@GetMapping("/{name}")


@Log(title = "system",businessType = BusinessType.OTHER)


public Person getPerson(@PathVariable("name") Stri


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


ng name, @RequestParam int age){


return new Person(name,age);


}


@PostMapping("add")


@Log(title = "system",businessType = BusinessType.INSERT)


public int addPerson(@RequestBody Person person){


if(StringUtils.isEmpty(person)){


return -1;


}


return 1;


}


@PutMapping("update")

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
spring-boot-route 使用aop记录操作日志,springboot入门项目实战