`

aspectj 做日志(二)

 
阅读更多

前面方案有个问题:异常日志无法跟异常信息在前台显示兼容(异常信息没法在前台显示出来)

 

最后为了显示他,不得不这样做:

/**
  * 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已经保存),这样 就保存了日志不会两条,而且有状态

0
0
分享到:
评论

相关推荐

    Aspectj

    8. **实战应用**: 在实际项目中,AspectJ常用于日志记录、事务管理、性能监控、权限控制等场景。通过切面,可以实现代码的整洁性和低耦合。 9. **学习资源**: 博文链接提供了一个很好的起点,其中详细介绍了AspectJ...

    aspectJ

    【AspectJ】是一种强大的面向切面编程(AOP)框架,它允许开发者在Java应用程序中进行声明式的横切关注点编程。AOP的核心思想是将系统中的横切关注点(如日志、事务管理、权限控制等)与业务逻辑分离,以提高代码的...

    Android Studio AspectJ技术1

    二、如何使用 AspectJ 在 Android Studio 中搭建工程 使用 AspectJ 在 Android Studio 中搭建工程需要满足一定的条件,例如: 1. 使用特定的 Gradle 版本,例如 classpath '...

    aspectj-1.9.6.jar

    面向切面编程(AOP)是一种编程范式,旨在解决软件开发中的横切关注点问题,比如日志、事务管理、性能监控等。这些关注点往往跨多个类和方法,传统的面向对象编程难以处理。AOP通过将这些关注点封装为独立的模块,...

    Aop之AspectJ详解解读demo

    **二、AspectJ的主要概念** 1. **切面(Aspect)**:切面是封装了横切关注点的类。例如,日志记录、事务管理等可以被封装为切面。 2. **连接点(Join Point)**:程序执行中的一个特定点,如方法的调用、异常的抛...

    book :aspectj in action

    4. 利用AspectJ进行日志记录、性能监控、事务管理和权限控制等实践案例。 5. 如何调试AspectJ代码,理解其编译过程和运行时行为。 6. 高级特性,如引入(introductions)、代理(proxies)和类型重定义(type ...

    精通AspectJ_源代码

    AspectJ是一种强大的面向方面的编程(AOP)框架,它扩展了Java语言,使得开发者能够更方便地处理系统中的横切关注点,如日志、事务管理、安全性等。本资源包含的是《精通AspectJ》一书中的示例代码,通过这些代码,...

    aspectj-1.6.9.jar

    AspectJ 是一个强大的面向切面编程(AOP)的框架,它允许开发者在Java应用程序中分离关注点,将横切逻辑(如日志、事务管理、安全性等)与核心业务逻辑相分离。`aspectj-1.6.9.jar` 是AspectJ框架的一个特定版本,即...

    AspectJ面向切面的例子

    5. `log`目录:运行时生成的日志文件,展示了AspectJ如何处理日志记录。 6. `config`目录:配置文件,可能包含游戏规则或AspectJ的配置信息。 通过分析和学习这个"Spacewar Example",开发者不仅可以了解AspectJ的...

    AspectJ in Action 2nd Edition

    ### AspectJ in Action 第二版:企业级AOP与Spring应用深入解析 #### 知识点一:AspectJ概述及特点 - **AspectJ简介**:AspectJ是一种面向切面编程(AOP)语言,它扩展了Java语言,提供了一种更强大的方式来处理...

    aspectj jar

    AspectJ是一个强大的、成熟的库,它扩展了Java语言,允许开发者定义和执行切面,这是一种分离关注点的方式,使得业务逻辑与横切关注点(如日志、事务管理或权限控制)可以独立编写和维护。 标题"aspectj jar"指的是...

    AspectJ经典实例详解

    AspectJ是一种强大的面向切面编程(AOP)的Java扩展,它允许开发者在不修改原有代码的情况下,将关注点如日志、事务管理等模块化,实现代码的解耦。AOP的核心理念是将横切关注点(如日志、异常处理等)与业务逻辑...

    AspectJ的JAR包

    传统的面向对象编程(OOP)将代码组织为类和方法,而切面编程则引入了一个新的抽象级别——切面,它封装了横切关注点,如日志、事务管理、性能监控等。切面可以跨越多个对象进行织入,使得这些关注点的实现和业务...

    org.aspectj,aspectj项目库(org.aspectj).zip

    AspectJ是一种强大的面向切面编程(AOP)框架,它扩展了Java语言,允许程序员以声明式方式处理系统的横切关注点,如日志、事务管理、性能监控等。这个压缩包可能包含了AspectJ的完整源代码,方便开发者进行学习、...

    AspectJ_Cookbook_English_edition

    《AspectJ Cookbook》是一本专为开发者准备的指南,它深入介绍了AspectJ这一强大的面向切面编程(AOP)框架。面向切面编程是一种编程范式,旨在提高软件的可维护性和可重用性,通过将关注点分离,使得业务逻辑与系统...

    aspectj,aspectjrt,weaver等

    它允许开发者在不修改源代码的情况下,通过切面(Aspect)来表达横切关注点,如日志、事务管理、性能监控等。AspectJ 提供了静态和动态两种织入方式,静态织入在编译时完成,而动态织入则在运行时进行。 AspectJRT ...

    Spring Aop之AspectJ注解配置实现日志管理的方法

    Spring Aop之AspectJ注解配置实现日志管理的方法 Spring Aop是基于AspectJ实现的面向切面编程(AOP),它提供了一个灵活的方式来实现日志管理。通过使用AspectJ注解,可以轻松地实现日志记录、性能监控、安全检查...

    Manning AspectJ in Action.pdf

    5. **实战示例**:通过实际项目案例,展示如何使用AspectJ解决实际问题,如日志记录、事务管理、性能监控等。这些示例可以帮助读者更好地理解AOP在实际开发中的应用。 6. **与其他框架的集成**:AspectJ可以与...

    aspectj 1.6.8 jar包

    AspectJ 是一个强大的面向切面编程(AOP)的开源框架,它允许开发者在Java应用程序中进行声明式的横切关注点编程。AOP的核心思想是将应用程序中的横切关注点(如日志、事务管理、性能监控等)与业务逻辑分离,以提高...

Global site tag (gtag.js) - Google Analytics