AOP失效问题
前言
AOP我们知道,可以做成一个切面,我们可以把类里一些公共的行为放到AOP中。例如在AOP里面打印一些请求接口时的请求参数,公共参数。在AOP里定义线程上下文,把必要的参数存储在线程上下文中。然而,如果AOP失效了呢?
问题描述
近期遇到一个AOP失效问题。排查过程略微艰辛。在代码的接口实现层都会有一个AOP注解,保证每个调用的接口都能够先进入AOP,然后再进入逻辑代码。但是日志里发现某个接口实现类里的方法都没有走AOP的代码。没有打印请求参数日志。逻辑代码中也取不到线程上下文的参数的值。但是其他实现类完全正常。拉取代码用jd工具反编译,报//INTERNAL ERROR//错误。
问题排查
也曾从网上查过AOP失效问题,也查过反编译报错问题。均无合适答案。因此去拉取了下这个实现类未改动前的代码,反编译。居然OK。整理此次实现类新加4个方法实现。一个个注释,本地编译然后反编译,定位到其中一个方法。但是查看逻辑,并没有什么问题。注意到这个类里有一个唯一的不同在于存在lambda表达式写法。但是lambda和AOP能有啥关系。不死心,遂注释。再次反编译,居然OK了。后续将lambda改回1.7方式。AOP失效也已解决。
问题原因
排查后得知,pom文件中使用的org.aspectj.aspectjrt的版本为1.6.9。这个版本是不支持lambda表达式的。因此代码里使用了lambda表达式,也会影响到AOP的运行。遂升版本。问题解决。
反思
遇到问题,不能被问题限死。AOP失效,不代表一定都是AOP本身问题。需要学会跳脱出来。换个思路。遇到之前没碰到过的问题,大不了一个一个耐心去排除。
网友评论