一、两者的区别
@Valid是JSR303规范的注解,不能分组检验,可以用在方法、构造函数、方法参数、成员属性(字段)上;
@Validated是Spring框架自带的注解,可以分组检验,可以用在类型、方法、方法参数上
二、两者结合使用(嵌套校验)
1.检验工具类
import javax.validation.*;
import java.util.List;
import java.util.Set;
public class ValidationUtil{
private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
//集合检验
public static <T> String validateList(List<T> list, Class<?>... group){
for( T item:list){
//校验该对象
Set<ConstraintViolation<T>> violations = validator.validate(item, group);
//校验失败,返回字符串打印和错误提示
if(!violations.isEmpty()){
StringBuilder errmsg = new StringBuilder();
for(ConstraintViolation<T> msg:violations){
errmsg.append(msg.getMessage()).append(", ");
}
return "tips:"+msg.toString();
}
}
return "200";//检验通过,返回200
}
}
2.实体类配置
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import javax.validation.constrains.*;
@Validated
public class Teacher{
@NotBlank(message="姓名不能为空", groups = {addOne.class})
private String tName;
@NotNull(message="年龄不能为空", groups = {addOne.class})
private Bigdecimal tAge;
@NotEmpty(message="学生不能为空", groups = {addOne.class})
@Valid
@Size(min=1,message="学生至少有一个",groups={addOne.class})
private List<Student> stus;
//校验分组-新增
public interface addOne{}
}
学生类
@Validated
public class Student{
@NotBlank(message="姓名不能为空",groups={Teacher.addOne.class})
private String sName;
@NotEmpty(message="成绩不能为空", groups = {Teacher.addOne.class})
private Bigdecimal score;
}
3.使用
方式一
public void save(@Validated(Teacher.addOne.class) @RequestBody Teacher vo){}
方式二
public void save(@RequestBody List<Teacher> vos){
ValidationUtils.validateList(vos,Teacher.addOne.class)
}
上述addOne分组是用于区分不同字段在不同接口是否需要校验,如果在所有情况下都需要校验可以将其去除。
三、注意事项
嵌套校验需要对list的对象类上必须加入@Validate注解
@NotBlank会校验为null或空字符串的情况,不能用于数值型字段
list参数为空检验用@NotNull或者@NotEmpty
参考文献
https://m.jb51.net/program/326152qth.htm
1864

被折叠的 条评论
为什么被折叠?



