1、AOP實現校驗,字符串去重

實現AOP 需要引入aop的maven 座標

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
       </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
            <version>2.1.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>

 

1、創建AOP文件

package com.deo.aop;
import com.deo.aop.util.AopValid;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;


/**date 2019年11月6日16:16:39
 *author qiaoyatao
 * aop校驗數據
 */
@Slf4j
@Component
@Aspect
@Order(1)
public class AopValidAspect {

    @Pointcut("execution(public * com.deo.controller.*.*.*(..))")
    public void webLog(){}
    //1、開始
    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        for (Object join : joinPoint.getArgs()) {
            if (join != null) {
                AopValid.clear(join);
                AopValid.valid(joinPoint);
            }
            return;
        }

    }

}

2、創建工具類

package com.deo.aop.util;

import com.deo.common.util.http.SysParams;
import com.deo.common.util.http.SysRequest;
import com.deo.common.util.validate.ValidatorUtil;
import com.deo.constants.Constant;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.reflect.MethodSignature;

import java.lang.reflect.Field;
import java.lang.reflect.Parameter;
import java.util.Arrays;

/**
 * auth qiaoyatao
 * date 2019-11-07
 */
public class AopValid {

    //1、校驗空
    public static void valid(JoinPoint joinPoint) {
        //獲取方法參數
        Object[] args = joinPoint.getArgs();
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        for (Parameter pr : signature.getMethod().getParameters()) {
            if (args[0] != null) {
                Object arg = Arrays.stream(args).filter(a -> pr.getType().isAssignableFrom(a.getClass())).findFirst().get();
                if (arg instanceof SysRequest) {
                    SysRequest sysRequest = (SysRequest) arg;
                    ValidatorUtil.validate(sysRequest.getBusParams());
                    return;
                }
                ValidatorUtil.validate(arg);
            }
        }
    }

    //2、去除string和空字符串
    public static void clear(Object join) throws Exception {
        Class<?> clazz = join.getClass();
        Field[] fieldsAll = clazz.getDeclaredFields();
        Class<?> superclass = clazz.getSuperclass();//獲取繼承父類對象
        if (!superclass.equals(Object.class)) {
            Field[] supfields = superclass.getDeclaredFields();
            clearFile(join, supfields);
        }
        clearFile(join, fieldsAll);
    }

    private static void clearFile(Object join, Field[] fields) throws Exception {
        for (Field field : fields) {
            field.setAccessible(true);
            Object val = field.get(join);
            if (val instanceof String) {
                if (val.equals(Constant.CONST_STRING) || String.valueOf(val).length() == 0) {
                    field.set(join, null);
                }
            } else if (val instanceof SysParams || field.getName().equals(Constant.BUSPARAMS)) {
                clear(val);
            }
        }
    }


}

3、創建ValidatorUtil 工具類

package com.deo.common.util.validate;


import com.deo.common.aop.advice.Assertion;
import com.deo.common.constants.Symbol;
import org.apache.commons.lang3.StringUtils;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;

/**
 * 實體驗證工具類
 *
 * @author machengxuan
 * @date 2019/03/07
 */
public class ValidatorUtil {

    private static ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();

    /**
     * 驗證並且在不通過時拋出異常消息
     *
     * @param t
     * @param groups
     * @param <T>
     */
    public static <T> void validate(T t, Class... groups) {
        Validator validator = validatorFactory.getValidator();
        Set<ConstraintViolation<T>> validateResult = validator.validate(t, groups);
        String message = generalMethod(validateResult);
        Assertion.isTrue(StringUtils.isNotBlank(message), message);
    }

    /**
     * Collection 驗證並且在不通過時拋出異常消息
     *
     * @param collection
     * @param groups
     * @param <T>
     */
    public static <T> void validateCollection(Collection<T> collection, Class... groups) {
        StringBuffer message = new StringBuffer();
        Validator validator = validatorFactory.getValidator();
        collection.forEach(e -> {
            Set<ConstraintViolation<T>> validateResult = validator.validate(e, groups);
            if (!validateResult.isEmpty()) {
                message.append(generalMethod(validateResult));
            }
        });
        Assertion.isTrue(StringUtils.isNotBlank(message.toString()), message.toString());
    }

    /**
     * 通用validateResult處理方法
     *
     * @param validateResult
     * @param <T>
     * @return
     */
    public static <T> String generalMethod(Set<ConstraintViolation<T>> validateResult) {
        if (!validateResult.isEmpty()) {
            List<String> errorList = new ArrayList<String>();
            validateResult.forEach(e -> {
                errorList.add(e.getPropertyPath().toString() + Symbol.COLON + e.getMessage());
            });
            return StringUtils.join(errorList, Symbol.COMMA);
        }
        return null;
    }

    /**
     * 獲取驗證結果set
     *
     * @param t
     * @param groups
     * @param <T>
     */
    public static <T> Set<ConstraintViolation<T>> getValidateResult(T t, Class... groups) {
        Validator validator = validatorFactory.getValidator();
        return validator.validate(t, groups);
    }

    /**
     * 獲取 Validator
     *
     * @param <T>
     */
    public static <T> Validator getValidator() {
        return validatorFactory.getValidator();
    }


    /**
     * 解析 BindingResult
     *
     * @param bindingResult
     * @return
     */
    public static String parseBindingResult(BindingResult bindingResult) {
        List<String> errorList = new ArrayList<String>();
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            errorList.add(fieldError.getField() + Symbol.COLON + fieldError.getDefaultMessage());
        }
        return StringUtils.join(errorList, Symbol.COMMA) + Symbol.PERIOD;
    }

}

 

2、實體類添加@NotNull 註解

package com.deo.dto;

import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

@Data
public class HelloDTO {

    @NotNull(message = "id必填")
    private Integer  id;

    @NotBlank(message = "name必填")
    private String  name;

}

3、測試

@PostMapping("/hello1")
    public HelloVO hello1(@RequestBody HelloDTO dto){
        return Assertion.isNull(dto, HelloVO.class);
    }

請求參數

{
  "id": 0,
  "name": ""
}

主要校驗字符是否空,字符空串替換爲null

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章