@Aspect aop 重复执行

@Aspect使用中出现的一些问题:

  因为最近系统需求想记录后台管理员的操作日志,比如点击了什么按钮,做过什么操作,传入了什么参数,返回了什么结果,统统想记录下来,所以需要截取controller层面的每个方法。

所以我第一反应想到的就是面向切面。实现的方式也有很多种,在这里我使用的就是@Aspect注解。
中间出现的问题记录一下。
1.没有切到切面:
@AfterReturning(pointcut="execution(* com.admin.controller..*.*(..)))",
            returning="returnValue")
    public void afterOp(JoinPoint point, Object returnValue){
        try {
            xxx;
            }
        } catch (Exception e) {
            logger.error("记录系统管理员操作日志异常:"+e);
        }
在配置完之后发现对应的controller层的方法执行完毕之后,并没有跳转到对应的方法中,经过一系列资料查阅后,解决方法如下:
1.有可能execution表达式不正确,要注意包名,类名,方法名,入参的规则等等。
2.注解没有开启<aop:aspectj-autoproxy proxy-target-class="true"/>,(网上看一些博客上说这个需要配置到springmvc的配置文件当中,在spring的配置文件中是没有效果的)

2.方法重复执行:
因为我切的是所有的controller的方法,所以当我去点击查询列表页面的时候进入了两次这个方法,后来去看,是因为controller层中使用了@InitBinder注解,主要是用来对页面数据进行解析绑定的,例如时间格式等。
解决方法:
加上targer的方法判断过滤掉。

因为项目配置和使用的框架不同,可能遇到的问题也不相同,所以仅仅是作为参考

猜你喜欢

转载自javawangzilong.iteye.com/blog/2409758