乐趣区

关于spring:Spring-Boot项目传参校验最佳实践

场景还原

简略业务场景模仿:

如果你当初在做一个问题录入零碎,你欢快地用 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怎么办?Studentscore分数,如果写错了,写成 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;  // 电话号码
}
退出移动版