Spring入参校验@Validated与@Valid结合使用

一、两者的区别

@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

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值