abel533 / MyBatis-Spring-Boot

Spring Boot集成MyBatis的基础项目
3.37k stars 1.59k forks source link

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

Open chris4dd opened 6 years ago

chris4dd commented 6 years ago

系统使用了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就可以被拦截。是这两者有什么区别吗?烦请赐教

abel533 commented 6 years ago

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

jacky1193610322 commented 5 years ago

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

jacky1193610322 commented 5 years ago

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

glasses1989 commented 4 years ago

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