1、业务场景
@RequestMapping("/insert")
public String insert(Student student){
if(Objects.equals(student.getName(),"")){
return "姓名不能为空";
}
if(null == student.getAge()){
return "年龄不能为空";
}
return "success";
}
如图所示,当前端访问接口时,现在要求参数不能为空,那我们只能这样写两个if判断是否为null。若name访问为空时候,则会如图返回
目前现在只有两个字段,若有大量的字段需要判断则如何呢,写大量的if?当一个接口里无效业务代码量过多,设计是有问题的,而且作为一个优秀的程序员,这不是我们想看到的结果。
如何解决呢?答案是@Valid的由来
@RequestMapping("/insert")
public String insert(@Valid Student student, BindingResult bindingResult){
if(bindingResult.hasErrors()){
return bindingResult.getAllErrors().get(0).getDefaultMessage();
}
//业务处理
return "success";
}
@Data
public class Student {
@NotBlank(message = "姓名不能为空")
@Length(message = "姓名不超过{max}个字符", max = 5)
private String name;
@NotNull(message = "年龄不能为空")
@Range(message = "年龄在{min}到{max}之间", min = 0, max = 10)
private Integer age;
@NotEmpty(message = "学生课程不能为空")
@Size(message = "每个学生最多选择{max}节课",max = 5)
private List<String> courseList;
}
从代码里可以看到,首先接收的bean对象需要用@valid注解验证,之后需要注意的是,bean里面
数字类型用@NotNull注解,字符串类型用@NotBlank注解,集合类型用的是@NotEmpty判断是否存在。他们判断长度的注解也不同,分别是@Length,@Range,@Size。
这里完成之后,此刻并不会返回前端提示什么字段为空,还需要在接口加BindingResult参数,接收异常数据,返回空字段给前端。