MyBatis-Spring-Boot icon indicating copy to clipboard operation
MyBatis-Spring-Boot copied to clipboard

Springboot用aop做日志,mybatis通用mapper基类的方法都没有切入

Open chris4dd opened this issue 6 years ago • 4 comments

系统使用了mybatis的插件通用mapper https://github.com/abel533/Mapper 做基类,其他mapper继承这个基类以减少对常规curd的编码。

现在的问题是发现所有基类方法如insert, delete, selectAll 等都无法被拦截,而且如果有方法调用了这些基类方法,也无法被拦截。

定义的注解AuditServiceLog

ask1

LogAspect

ask2

定义在controller上表现正常

ask3

访问对应页面会有日志

ask4

定义在没有调用通用mapper方法的service或者handler方法上也ok

ask5 ask6

而使用了通用mapper方法的则一律没有反应

ask7 ask8

这里UserService里面调用通用mapper的方法,导致整个UserService上面的方法都不能被拦截。

同时不使用注解直接使用execution语法的方式也尝试过。症状类似,通用mapper的方法被忽略 @Pointcut("execution(* com.hry.spring.mvc.aop.log.service...(..))")

aop的配置为springboot默认

ask9

有同事使用常规spring mvc(非springboot)通过xml配置的方法,似乎没有特别配置通用mapper就可以被拦截。是这两者有什么区别吗?烦请赐教

chris4dd avatar May 14 '18 02:05 chris4dd

这个问题应该和通用 Mapper 没关系。

abel533 avatar May 17 '18 07:05 abel533

我也遇到这个问题,拦截不了

jacky1193610322 avatar Jan 09 '19 10:01 jacky1193610322

我这边已经可以了,是自己忘了在@Aspect的类上面加@Component @chris4dd 你的execution 貌似有问题,你试着改成* com.xxx.xx..(..) 具体我没有深入execution

jacky1193610322 avatar Jan 09 '19 11:01 jacky1193610322

1.你的UserService不是基于接口的,所以你需要修改aop为基于cglib的方式; 2.mapper接口在低版本(5.x之前)无法被代理,因为mapper接口方法的调用是通过代理类来完成的,参考:https://cloud.tencent.com/developer/article/1170370

glasses1989 avatar May 06 '20 08:05 glasses1989