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());
}
}