注解校验

自定义注解

申明注解

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)

使用指定分组后未添加分组的校验不生效

posted @ 2023-06-18 20:57  france水  阅读(9)  评论(0编辑  收藏  举报