SpringAOP实战---POST和PUT请求,在方法执行前做相应处理

99 阅读1分钟
package com.amap.klun.aspect;

import com.amap.qinling.entity.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;

import java.lang.reflect.Field;

//声明这是一个切面类
@Aspect
@Component
public class StringBullTransJsonAspect {

     //配置切点,配置POST和PUT请求的时候,执行此方法(这个方法也是目标方法)
    @Pointcut(value = "@annotation(org.springframework.web.bind.annotation.PostMapping) || @annotation(org.springframework.web.bind.annotation.PutMapping)")
    public void poincutAspect(){
    }

    /**
     * 配置当前方法,在切点方法之前执行
     */
    @Before(value = "poincutAspect()")
    public static <T extends  BaseEntity>  void aspectAround(JoinPoint joinPoint){

        //获取目标方法的参数对象列表
        Object[] args = joinPoint.getArgs();

        /**
         * 如果保存或更新的字段,1.在数据库中使用json格式保存 2.从前端传过来的是空字符串 ,那么需要将数据设置为 null,否则数据库无法进行保存或更新
         */
        for (Object arg : args) {
            try {
                Class<?> aClass = arg.getClass();

                /**
                 * 判断BaseEntity是否是 args 的父类或者当前类
                 * 另一种方法判断当前类是不是BseEntity的字类或当前类: if(!(arg instanceof BaseEntity)){continue;}
                 */
                if(!(BaseEntity.class.isAssignableFrom(aClass))){
                    continue;
                }
                Field[] fields = aClass.getDeclaredFields();
                for (Field field : fields) {
                    field.setAccessible(true);

                    //判断当前字段的数据类型是不是String
                    if(!field.getType().getName().equals("java.lang.String")){continue;};

                    //判断当前属性有ApiModelProperty注解
                    if(!field.isAnnotationPresent(ApiModelProperty.class)){continue;}

                    //判断当前属性在ApiModelProperty注解中 value是否填写 json,代表此字段在数据库中是json格式的数据
                    Boolean contains = field.getAnnotation(ApiModelProperty.class).value().contains("json");
                    if(!contains){continue;}

                    //获取当前属性的值
                    Object value = field.get(arg);
                    if(!ObjectUtils.isEmpty(value)){continue;}

                    //因为空字符串适应不了 json格式的数据,所以将数据设置为null,保存在数据库中
                    field.set(arg,null);
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }

    }

}