当前位置: 代码迷 >> 综合 >> validate 无处不在
  详细解决方案

validate 无处不在

热度:60   发布时间:2024-02-19 18:40:24.0

3.可以在任何位置使用validate校验 rpc或内部service 

定义注解

import java.lang.annotation.*;@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Validated {Class<?>[] value() default {};}

注解切面实现 


import cn.hutool.core.util.ArrayUtil;
import com.bjsdzk.backend.rpc.entity.response.ResultCode;
import com.bjsdzk.backend.rpc.entity.response.ResultHandler;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import java.util.*;@Aspect
@Component
public class ValidatedAspect {@Autowiredprivate Validator globalValidator;@Pointcut("@annotation(com.bjsdzk.collector.config.Validated)")private void pointcut() {}@Around(value = "pointcut()&&@annotation(validated)")private Object aroundMethod(ProceedingJoinPoint point, Validated validated) throws Throwable {Class<?>[] classArray = validated.value();Object[] args = point.getArgs();Set<ConstraintViolation<Object>> validateAll = new HashSet<>();for (int j = 0; j < args.length; j++) {Object parms = args[j];Set<ConstraintViolation<Object>> validate;if (ArrayUtil.isEmpty(classArray)) {validateAll.addAll(globalValidator.validate(parms));} else {for (int i = 0; i < classArray.length; i++) {validateAll.addAll(globalValidator.validate(parms));validateAll.addAll(globalValidator.validate(parms, classArray[i]));}}}if (validateAll.isEmpty()) {return point.proceed();} else {return ResultHandler.error(ResultCode.VALIDATION, validateAll.stream().map(ConstraintViolation::getMessage).reduce("", StringUtils::join));}}
}

参数实体类 

@Data
public class DeviceInfo extends BaseDeviceInfo implements Serializable {@NotNull(message = "companyId不能为空",groups = {AddGroup.class, UpdateGroup.class})private String companyId;@NotNull(message = "rangeCode不能为空",groups = {AddGroup.class, UpdateGroup.class})private String rangeCode;private String targetDeviceId;}

 使用方法

    @Validated(AddGroup.class)public Result add(DeviceInfo deviceInfo) {log.info(deviceInfo.toString());return localDeviceServiceMap.get(deviceInfo.getDtuType().toString()).add(deviceInfo);}

 

  相关解决方案