前面方案有个问题:异常日志无法跟异常信息在前台显示兼容(异常信息没法在前台显示出来)
最后为了显示他,不得不这样做:
/** * controller日志注解,入口日志 * @author wj * */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface ControllerLogAnnotation { //模块名 String moduleName(); //操作内容 String option(); }
/** * service日志注解,异常日志 * @author wj * */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface ServiceLogAnnotation { String action(); }
@After(value = "controllerlogAspect() && @annotation(annotation) &&args(object,..) ", argNames = "") public void doAfter(JoinPoint joinPoint, ControllerLogAnnotation annotation, Object object) { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) .getRequest(); try { // String title = getAnnotationValue(joinPoint); String title = getAnnotationValue(annotation); saveLog(request, title); } catch (Exception e) { e.printStackTrace(); // 记录本地异常日志 logger.error("==异常通知异常=="); logger.error("异常信息:{}", e.getMessage()); } }
@AfterThrowing(value = "servicelogAspect() && @annotation(annotation) &&args(..) " , throwing = "e") public void doAfterThrowing(JoinPoint joinPoint, ServiceLogAnnotation annotation, Exception e) { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) .getRequest(); try { String title = getAnnotationValue(annotation); saveLog(request, title, e); } catch (Exception ex) { // 记录本地异常日志 logger.error("==异常通知异常=="); logger.error("异常信息:{}", ex.getMessage()); } }
使用:
controller--
/** * 新建一个用户 * @throws Exception */ @RequestMapping(value="saveUser") @ControllerLogAnnotation(moduleName="用户管理",option="新建用户") public void saveUser(User data,String[] funidvalue,HttpServletResponse response) { Json json = new Json(); try { service.saveUser(data,funidvalue); json.setSuccess(true); json.setMsg("保存成功"); } catch (Exception e) {//service :回滚、记录异常日志 // TODO Auto-generated catch block e.printStackTrace(); json.setSuccess(false); json.setMsg(e.getMessage()); logger.error(e.getMessage()); } writeJson(response,json); }
service----
@ServiceLogAnnotation(action="保存用户") public void saveUser(User data,String[] funidvalue) throws Exception{ if (data != null) { User u = userDao.findByUserid(data.getUserId());//查询出的用户会回滚? if (u != null) { throw new Exception("新建用户失败,用户名已存在!"); } else { entryptPassword(data); data.setStatus(Constants.UserStatusEnum.Active.getIndex());//默认激活状态 userDao.save(data); } } }
这样就是,分为入口日志和异常日志。入口日志肯定有,不管有无异常(这样有个问题,异常的时候会有两条日志)。
可以这样解决:在controller层,可以对返回值进行改造,JSON,在@AfterReturning里拿到返回值,再判断返回值,成功则保存日志,失败不保存(@AfterThrowing已经保存),这样 就保存了日志不会两条,而且有状态
相关推荐
8. **实战应用**: 在实际项目中,AspectJ常用于日志记录、事务管理、性能监控、权限控制等场景。通过切面,可以实现代码的整洁性和低耦合。 9. **学习资源**: 博文链接提供了一个很好的起点,其中详细介绍了AspectJ...
【AspectJ】是一种强大的面向切面编程(AOP)框架,它允许开发者在Java应用程序中进行声明式的横切关注点编程。AOP的核心思想是将系统中的横切关注点(如日志、事务管理、权限控制等)与业务逻辑分离,以提高代码的...
二、如何使用 AspectJ 在 Android Studio 中搭建工程 使用 AspectJ 在 Android Studio 中搭建工程需要满足一定的条件,例如: 1. 使用特定的 Gradle 版本,例如 classpath '...
面向切面编程(AOP)是一种编程范式,旨在解决软件开发中的横切关注点问题,比如日志、事务管理、性能监控等。这些关注点往往跨多个类和方法,传统的面向对象编程难以处理。AOP通过将这些关注点封装为独立的模块,...
**二、AspectJ的主要概念** 1. **切面(Aspect)**:切面是封装了横切关注点的类。例如,日志记录、事务管理等可以被封装为切面。 2. **连接点(Join Point)**:程序执行中的一个特定点,如方法的调用、异常的抛...
4. 利用AspectJ进行日志记录、性能监控、事务管理和权限控制等实践案例。 5. 如何调试AspectJ代码,理解其编译过程和运行时行为。 6. 高级特性,如引入(introductions)、代理(proxies)和类型重定义(type ...
AspectJ是一种强大的面向方面的编程(AOP)框架,它扩展了Java语言,使得开发者能够更方便地处理系统中的横切关注点,如日志、事务管理、安全性等。本资源包含的是《精通AspectJ》一书中的示例代码,通过这些代码,...
AspectJ 是一个强大的面向切面编程(AOP)的框架,它允许开发者在Java应用程序中分离关注点,将横切逻辑(如日志、事务管理、安全性等)与核心业务逻辑相分离。`aspectj-1.6.9.jar` 是AspectJ框架的一个特定版本,即...
5. `log`目录:运行时生成的日志文件,展示了AspectJ如何处理日志记录。 6. `config`目录:配置文件,可能包含游戏规则或AspectJ的配置信息。 通过分析和学习这个"Spacewar Example",开发者不仅可以了解AspectJ的...
### AspectJ in Action 第二版:企业级AOP与Spring应用深入解析 #### 知识点一:AspectJ概述及特点 - **AspectJ简介**:AspectJ是一种面向切面编程(AOP)语言,它扩展了Java语言,提供了一种更强大的方式来处理...
AspectJ是一个强大的、成熟的库,它扩展了Java语言,允许开发者定义和执行切面,这是一种分离关注点的方式,使得业务逻辑与横切关注点(如日志、事务管理或权限控制)可以独立编写和维护。 标题"aspectj jar"指的是...
AspectJ是一种强大的面向切面编程(AOP)的Java扩展,它允许开发者在不修改原有代码的情况下,将关注点如日志、事务管理等模块化,实现代码的解耦。AOP的核心理念是将横切关注点(如日志、异常处理等)与业务逻辑...
传统的面向对象编程(OOP)将代码组织为类和方法,而切面编程则引入了一个新的抽象级别——切面,它封装了横切关注点,如日志、事务管理、性能监控等。切面可以跨越多个对象进行织入,使得这些关注点的实现和业务...
AspectJ是一种强大的面向切面编程(AOP)框架,它扩展了Java语言,允许程序员以声明式方式处理系统的横切关注点,如日志、事务管理、性能监控等。这个压缩包可能包含了AspectJ的完整源代码,方便开发者进行学习、...
《AspectJ Cookbook》是一本专为开发者准备的指南,它深入介绍了AspectJ这一强大的面向切面编程(AOP)框架。面向切面编程是一种编程范式,旨在提高软件的可维护性和可重用性,通过将关注点分离,使得业务逻辑与系统...
它允许开发者在不修改源代码的情况下,通过切面(Aspect)来表达横切关注点,如日志、事务管理、性能监控等。AspectJ 提供了静态和动态两种织入方式,静态织入在编译时完成,而动态织入则在运行时进行。 AspectJRT ...
Spring Aop之AspectJ注解配置实现日志管理的方法 Spring Aop是基于AspectJ实现的面向切面编程(AOP),它提供了一个灵活的方式来实现日志管理。通过使用AspectJ注解,可以轻松地实现日志记录、性能监控、安全检查...
5. **实战示例**:通过实际项目案例,展示如何使用AspectJ解决实际问题,如日志记录、事务管理、性能监控等。这些示例可以帮助读者更好地理解AOP在实际开发中的应用。 6. **与其他框架的集成**:AspectJ可以与...
AspectJ 是一个强大的面向切面编程(AOP)的开源框架,它允许开发者在Java应用程序中进行声明式的横切关注点编程。AOP的核心思想是将应用程序中的横切关注点(如日志、事务管理、性能监控等)与业务逻辑分离,以提高...