场景还原
简略业务场景模仿:
如果你当初在做一个问题录入零碎,你欢快地用Spring Boot
框架写了一个后盾接口,用于接管前台浏览器传过来的 Student
对象,并插入后盾数据库。
咱们将传入的 Student
对象定义为:
public class Student {
private String name; // 姓名
private Integer score; // 考试分数(满分100分)
private String mobile; // 电话号码(11位)
}
而后写一个Post申请的后盾接口,来接管网页端传过来的 Student对象:
@RestController
public class TestController {
@Autowired
private StudentService studentService;
@PostMapping("/add")
public String addStudent( @RequestBody Student student ) {
studentService.addStudent( student ); // 将student对象存入数据库
return "SUCCESS";
}
}
此时我想你肯定看进去了下面这段代码的破绽,因为咱们并没有对传入的 Student
对象做任何数据校验,比方:
Student对象里三个字段的某一个忘传了,为 null
怎么办?Student
的 score
分数,如果写错了,写成 101分怎么办?Student的 mobile11位手机号码,如果填错了,多写了一位怎么办?…等等
这些数据尽管在前端页面个别会做校验,但咱们作为一个谨严且良心的后端开发工程师,咱们必定要对传入的每一项数据做严格的校验,所以咱们应该怎么写?
@PostMapping("/add")
public String addStudent( @RequestBody Student student ) {
if( student == null )
return "传入的Student对象为null,请传值";
if( student.getName()==null || "".equals(student.getName()) )
return "传入的学生姓名为空,请传值";
if( student.getScore()==null )
return "传入的学生问题为null,请传值";
if( (student.getScore()<0) || (student.getScore()>100) )
return "传入的学生问题有误,分数应该在0~100之间";
if( student.getMobile()==null || "".equals(student.getMobile()) )
return "传入的学生电话号码为空,请传值";
if( student.getMobile().length()!=11 )
return "传入的学生电话号码长度有误,应为11位";
studentService.addStudent( student ); // 将student对象存入MySQL数据库
return "SUCCESS";
}
神注解加持!
public class Student {
@NotNull(message = "传入的姓名为null,请传值")
@NotEmpty(message = "传入的姓名为空字符串,请传值")
private String name; // 姓名
@NotNull(message = "传入的分数为null,请传值")
@Min(value = 0,message = "传入的学生问题有误,分数应该在0~100之间")
@Max(value = 100,message = "传入的学生问题有误,分数应该在0~100之间")
private Integer score; // 分数
@NotNull(message = "传入的电话为null,请传值")
@NotEmpty(message = "传入的电话为空字符串,请传值")
@Length(min = 11, max = 11, message = "传入的电话号码长度有误,必须为11位")
private String mobile; // 电话号码
}
发表回复