@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());
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章