前言

JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator。

此实现与 Hibernate ORM 没有任何关系。 JSR 303 用于对 Java Bean 中的字段的值进行验证。
Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中对表单提交的数据方便地验证。
注:可以使用注解的方式进行验证

image.png

开启校验,使用@Valid,给校验的bean后面紧跟一个BindingResult,就可以获取到校验规则

@ExceptionHandler(value = {MethodArgumentNotValidException.class})
    public R handlerValidException(MethodArgumentNotValidException e) {
//        log.error("校验数据数据出现问题 {},异常类型 {}",e.getMessage(),e.getClass());
        Map map = new HashMap();
        e.getBindingResult().getFieldErrors().forEach(item -> {
                String field = item.getField();
                String message = item.getDefaultMessage();
                map.put(field,message);
        });
        log.error("校验数据数据出现问题 {}",map);
        return R.error(BizCodeEnum.VALID_EXCEPTION).put("data",map);
    }

分组功能

  1. 创建几个用于标识的类只是用来标识,AddGroup.class,UpdateGroup.class
  2. @Pattern(regexp = "/^[a-zA-Z]$/",message = "检索首字母必须是一个字母",groups = {AddGroup.class,UpdateGroup.class}),给校验注解标注什么时候需要进行校验
  3. 使用@Validated({AddGroup.class})
  4. 默认没有指定分组的校验注解,在分组使用@Validated({AddGroup.class})下不生效

自定义校验

  1. 编写一个自定义的校验注解
  2. 编写一个自定义的校验器ConstraintValidator
  3. 关联自定义的校验器和自定义的校验注解
/**
自定义校验注解
*/
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
//这里绑定自定义校验器
@Constraint(validatedBy = { ListValueConstraintValidtor.class})
public @interface ListValue {
    String message() default "{com.atguigu.mall.common.valid.ListValue.message}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };

    int[] vales();
}
/**
 * @ClassName ListValueConstraintValidtor
 * @Author HETAO
 * @Date 2020/12/4 11:16
 */
//这里泛型,第一个参数代表自定义校验注解,第二个是校验的类型
public class ListValueConstraintValidtor implements ConstraintValidator<ListValue,Integer> {
    private static IntStream result;

    /**
     * 校验逻辑
     * @param value
     * @param context
     * @return
     */
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        return value != null && result.anyMatch(value1 -> value1 == value);
    }

    /**
     * 初始化值
     * @param constraintAnnotation
     */
    @Override
    public void initialize(ListValue constraintAnnotation) {
        result = Arrays.stream(constraintAnnotation.vales());
    }
}

ValidationMessages.properties,默认提示信息
image.png