@Valid 和 @Validated |杂叙

1.介绍区别:

1.@Valid

  1. 注解的位置:METHOD(方法), FIELD(字段), CONSTRUCTOR(构造器), PARAMETER(参数), TYPE_USE (所有类型都能用)
  2. @Valid只验证第一层级,不会去验证旗下类中包含的其他没带@Valid实体
  3. 判断所有字段

2. @Validated

1.注解的位置:{ElementType.TYPE(类、接口(包括注释类型)或enum声明 ), ElementType.METHOD(方法), ElementType.PARAMETER(参数)}
2. @Validated 会验证旗下的实体类,不需要再加@Valid的注解
3. 可以指定组来判断任意分组下的字段

2.介绍常用的注解:

  1. @Min 最小值
  2. @NotNull 不能为空 字符串,实体都可以 数字等等
  3. @Max 最大值
  4. @Length 长度判断只能判断字符串
  5. @Size @Length @Size 判断字符串 没区别,length 只能判断字符串,size 能判断数组,集合,map,string
  6. @NotBlank 不能为空字符串

3.@Validated group

  1. group 如果不填是默认值是{} ==》源码说默认是Default 但是我做了一些测试,发现也不是说的那样,更像是所有组都验证,面对这种情况,最好还是把组填上,比如group=Default.class
  2. group 填了分组 ,如果分组接口继承了Default,就会连不填的,或Default的分组的全验证

4.如何自定义组验证,比如这接口在一定条件下是要验证group A 一定条件是group B 但是,@Valiidated 没有支持这种关系,加不上if else

解决方式: 手动引发Validated 的验证策略:
想法来源:DataBinder.class ModelAttributeMethodProcessor.class

 private static Validator validator;

    static {
        validator = Validation.buildDefaultValidatorFactory().getValidator();
    }

    /**
     * 校验对象
     * @param object        待校验对象
     * @param groups        待校验的组
     * @throws AdcException  校验不通过,则报AdcException异常
     */
    public static void validateEntity(Object object, Class<?>... groups)
            throws AdcException {
        Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);
        if (!constraintViolations.isEmpty()) {
            StringBuilder msg = new StringBuilder();
            for(ConstraintViolation<Object> constraint:  constraintViolations){
                msg.append(constraint.getMessage()).append("/n");
            }
            throw new AdcException(msg.toString());
        }
    }

你可能感兴趣的:(java基础,spring)