注解校验
自定义注解
申明注解
package com.wpc.springbootdynamicsourceswtich.validate;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * @ClassName EnumValidate
 * @Description TODO
 * @Author wpc
 * @Date 2023/3/27 10:20
 */
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {EnumValidateValidator.class})
public @interface EnumValidate {
    String[] strValue() default "";
    String message() default "枚举值传入错误";
    boolean required() default false;
    Class<?> [] groups() default {};
    Class<? extends Payload> [] payload() default {};
}
自定义校验
package com.wpc.springbootdynamicsourceswtich.validate;
import org.apache.commons.lang3.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
 * @ClassName EnumValidateValidator
 * @Description TODO
 * @Author wpc
 * @Date 2023/3/27 10:23
 */
public class EnumValidateValidator implements ConstraintValidator<EnumValidate, Object> {
    private boolean required;
    private String[] values;
    @Override
    public void initialize(EnumValidate constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);
        required = constraintAnnotation.required();
        this.values = constraintAnnotation.strValue();
    }
    @Override
    public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
        //非必传
        if (!required && o == null) {
            return true;
        }
        //必传为null直接返回
        if (o == null) {
            return false;
        }
        try {
            if (values != null ) {
                for (String value : values) {
                    if (value.equals(o)) {
                        return true;
                    }
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException("枚举类型验证错误");
        }
        return false;
    }
}
@NotBlank、@NotEmpty、@NotNull区别
- @NotNull:主要用在基本数据类型上(int,Integer,Double),不能为null,但是可以是空字符串
 - @NotEmpty:主要用在集合类上,不能为空,而且长度必须大于0(" "," ");
 - @NotBlank:用在字符串上
 
注解不生效的原因
- 
实体类上必须要添加@Valid注解去校验
 - 
添加校验注解后还未生效可能是需要添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> <version>2.7.12</version> </dependency> 
获得校验的结果
- 在实体类后面添加 BindingResult result
 
controller层统一处理
@Slf4j
@RestControllerAdvice("xxx")
public class ExecptionControllerAdvice {
    /**
     * 参数非法(效验参数)异常 MethodArgumentNotValidException
     * @param e
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public R handleValidException(MethodArgumentNotValidException e) {
        log.error("数据效验出现问题{},异常类型{}",e.getMessage(),e.getClass());
        BindingResult bindingResult = e.getBindingResult();
        Map<String,String> errMap = new HashMap<>();
        bindingResult.getFieldErrors().forEach((fieldError) -> {
            errMap.put(fieldError.getField(),fieldError.getDefaultMessage());
        });
        return R.error(BizCodeEnum.VAILD_EXCEPTION.getCode(),BizCodeEnum.VAILD_EXCEPTION.getMessage())
                .put("data",errMap);
    }
    @ExceptionHandler(value = Throwable.class)
    public R handleException(Throwable throwable) {
        log.error("错误异常{}",throwable);
        return R.error(BizCodeEnum.UNKNOW_EXCEPTION.getCode(),BizCodeEnum.UNKNOW_EXCEPTION.getMessage());
    }
}
分组校验
添加分组接口AddGroup、UpdateGroup
public interface AddGroup {
}
public interface UpdateGroup {
}
注解指定分组
@NotBlank(groups = {AddGroup.class})
controller添加@Validated(AddGroup.class)
使用指定分组后未添加分组的校验不生效

                
            
        
浙公网安备 33010602011771号