美文网首页
spring AspectJ修改controller入参对象值

spring AspectJ修改controller入参对象值

作者: 2d6b5ee3a71c | 来源:发表于2018-12-03 13:31 被阅读0次

    背景: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: 环绕通知,围绕着方法执行

    相关文章

      网友评论

          本文标题:spring AspectJ修改controller入参对象值

          本文链接:https://www.haomeiwen.com/subject/pyaecqtx.html