1.介紹區別:
1.@Valid
- 註解的位置:METHOD(方法), FIELD(字段), CONSTRUCTOR(構造器), PARAMETER(參數), TYPE_USE (所有類型都能用)
- @Valid只驗證第一層級,不會去驗證旗下類中包含的其他沒帶@Valid實體
- 判斷所有字段
2. @Validated
1.註解的位置:{ElementType.TYPE(類、接口(包括註釋類型)或enum聲明 ), ElementType.METHOD(方法), ElementType.PARAMETER(參數)}
2. @Validated 會驗證旗下的實體類,不需要再加@Valid的註解
3. 可以指定組來判斷任意分組下的字段
2.介紹常用的註解:
- @Min 最小值
- @NotNull 不能爲空 字符串,實體都可以 數字等等
- @Max 最大值
- @Length 長度判斷只能判斷字符串
- @Size @Length @Size 判斷字符串 沒區別,length 只能判斷字符串,size 能判斷數組,集合,map,string
- @NotBlank 不能爲空字符串
3.@Validated group
- group 如果不填是默認值是{} ==》源碼說默認是Default 但是我做了一些測試,發現也不是說的那樣,更像是所有組都驗證,面對這種情況,最好還是把組填上,比如group=Default.class
- 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());
}
}