背景:spring boot项目中用到了mybatis plus。
问题:因项目中前端传入的分页参数中的总页数有值,导致mybatis plus少执行了一次查总页数的sql。
解决:所有的列表查询都传入了总页数,前端修改不切实际,所以通过spring AspectJ拦截所有的controller中有总页数Page对象的方法,将Page对象的总页数改为0,即解决该问题。
具体代码:
@Aspect
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true) //开启aop功能,该行代码通常放在application启动类里面
public class PageAspect {
//声明切入点
//com.web..*为包路径,有2个点表示路径有多层,后面的.*是方法
//如果方法传入的参数有多个,需要加上“,..”
@Pointcut("execution(* com.web..*.*(com.baomidou.mybatisplus.extension.plugins.pagination.Page,..)) && args(page,..)")
public void searchPagePointcut(Page page) {
}
@Around(value = "searchPagePointcut(page)", argNames = "page")
public Object dealPage(ProceedingJoinPoint joinpoint, Page page) throws Throwable {
if (null != page) {
page.setTotal(0);
}
return joinpoint.proceed();
// 方式2:从joinpoint.getArgs()中获取参数做修改
// Object[] args = joinpoint.getArgs();
// if (null != args) {
// for (Object obj : args) {
// if (obj instanceof Page) {
// Page temp = (Page) obj;
// temp.setTotal(0);
// }
// }
// }
// return joinpoint.proceed(args);
}
}
附AspectJ的几种通知注解:
1.@Before: 前置通知, 在方法执行之前执行
2.@After: 后置通知, 在方法执行之后执行
3.@AfterRunning:返回通知, 在方法成功执行返回结果之后执行
4.@AfterThrowing: 异常通知, 在方法抛出异常之后
5.@Around: 环绕通知,围绕着方法执行
网友评论