實現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