AOP处理业务类中重复校验

  • 我们项目中会有一些公共的校验,像商户的合同和流水是否重复等等,之前是在每个业务类中都做一次验证,本次的项目重构中,我尝试把这些公共的校验提取出来作为一个切面来处理,但是在业务中会用到这些查询出来的结果,我尝试在请求参数的父类中增加一个私有对象来赋值,这样可以在AOP中校验完毕对参数进行赋值,在下文业务类处理直接get这个参数即可,减少了很多的代码量,下面是我的一个demo,可以做为参考项
  • 首先是一个父类的请求类假设 date和time是公共的请求参数,每个请求类都需要继承这个父类,Db是业务中的一个数据库DTO
package com.sunyw.xyz.bean;

import lombok.Data;

import java.io.Serializable;

@Data
public class BaseReq implements Serializable {


    private String date;

    private String time;

    private Db db;
}

  • DB是要存到数据库中的值,需要在service中进行获取
package com.sunyw.xyz.bean;

import lombok.Data;

@Data
public class Db {

    private String name;

    private String age;

}

  • 这是一个请求类实体,继承baseReq
package com.sunyw.xyz.bean;

import lombok.Data;

@Data
public class TestReq extends BaseReq {

    private String parm;

}

  • 下面是AOP处理,切点是service的所有,在执行业务请求前进行处理
package com.sunyw.xyz.limiter;

import com.alibaba.fastjson.JSON;
import com.sunyw.xyz.bean.BaseReq;
import com.sunyw.xyz.bean.Db;
import com.sunyw.xyz.bean.TestReq;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;


@Component
@Aspect
@Slf4j
public class TestAop {


    @Before("execution(public * com.sunyw.xyz.service.*.*(..)))")
    public void run(JoinPoint joinPoint) {
        log.info("开始进入业务切面");
        Object[] args = joinPoint.getArgs();
        Object arg = args[0];
        log.info("参数校验~~~~~~~~");
        //这里是参数的校验校验通过后进行赋值的操作
        System.out.println(arg);
        if (arg instanceof BaseReq){
            log.info("参数为:[{}]", JSON.toJSON(arg));
            BaseReq req =(BaseReq)arg;
            Db db = new Db();
            db.setAge("12");
            db.setName("sunyw");
            req.setDate("2365");
            req.setTime("4567");
            req.setDb(db);
        }
    }
}


  • 这是业务处理类,需要获取到db然后进行后续的操作
package com.sunyw.xyz.service;

import com.sunyw.xyz.bean.Db;
import com.sunyw.xyz.bean.TestReq;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class TestService {


    public String run(TestReq testReq){
        log.info("开始执行业务逻辑");
        log.info("业务参数为:{}",testReq.toString());
        Db db = testReq.getDb();
        log.info("db:{}",db.toString());
        System.out.println(testReq.getDate());
        System.out.println(testReq.getTime());
        return "SUCCESS";
    }

}

  • web端

    @PostMapping("/send")
    public String send(@RequestBody TestReq testReq){
        return testService.run(testReq);
    }
  • 执行的结果
    在这里插入图片描述
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页