问题:在与移动端对接过程中,突然发现某一块数据的内容出现重复,且分页查询时总是返回相同的条数,不管分几页都是这三条数据。
解决思路:
1.先去数据库查看是否是数据有问题;
2.查看相应的代码,检查是否是代码层面的问题;
3.配合移动端联调,打断点查看问题;
4.找到问题后,进行解决;
实际解决:
1.去数据库中查看相应查询的数据,发现没有问题,该内容下只有三条数据,因为我这里是每页默认20条,那么就是从第一页以后,理论情况下是之后就查不到数据了,但是这里是一直有且每次都为3条。由此可以知道是代码层面分页有问题;
2.去查看相应的代码,我发现同事使用的分页是缓存分页,然后这个缓存分页是我利用aop写的一个通用的缓存分页,对比其它地方使用这个aop的不同是,其它地方的方法是直接通过注入的service调用,而这里是直接在service内部调用,由此猜想很可能是因为这个aop没有生效导致没有进行分页,然后每次查询的结果都一样;
3.与移动端沟通,进行联调,打断点后发现,代码没有进入aop,也就是实际中没有进行分页;找到原因所在,也就是在service内部调用内部方法时导致没有进入aop,换而言之,aop无法切私有方法,猜想spring aop是不是必须通过容器中的bean调用才能生效;
4.查找资料发现,向spring容器拿实例,实际上拿到的是代理类,调用代理类方法时会先执行aop 中的切面代码,然后才会调用实例的方法,需要理解基于动态代理的aop原理。而内部直接调用方法的话是不走spring代理的,所以导致没有生效。
解决方法:
在方法中获取当前类的bean,然后再进行调用;例如
xxxxx bean = (xxxxx ) SpringContextUtils.getBean(xxxxx .class);
bean.method();
//注意这个method是xxxxx 类里面的方法.
将原来的this.改为以上的方式,就可以成功生效aop。
网友评论