前言
在实际开发过程中,经常需要对前端传来的数据模型进行校验,一般情况下都是写一个专门的校验函数去校验,这种方式很显然不适合复杂的项目,因为随着项目复杂度的增加需要校验的数据模型越来越多,并且在开发过程中可能也需要时常修改数据模型,这就导致原来的校验方法可能需要时常的变动,也不利于维护。因为我们需要一种更简单的方式去完成这个工作。
@Valid 和 BindingResult
SpringBoot 在内部通过集成 hibernate-validation 已经实现了JSR-349验证规范接口,在SpringBoot项目中只要直接使用就行了。接下来通过一个简单的例子完整的介绍使用方法
Example
以注册用户为例
定义 Bean
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public class User{ @NotBlank(message="手机号不能为空") private String phone; @NotBlank(message="手机号不能为空") private String password; public void setPhone(String phone) { this.phone = phone; } public void setPassword(String password) { this.password = password; } public String getPhone() { return phone; } public String getPassword() { return password; } }
|
定义 Controller
在 controller 类里面对相应的接口添加 @Valid,BindingResult 验证,如果检验失败,则获取错误信息返回前台
1 2 3 4 5 6 7 8 9 10 11 12
| @RestController @RequestMapping(value = "/user") public class UserController { @PostMapping(value = "/register") public User login(@RequstBody @Valid User userInfo, BindingResult bindingResult) { if (bindingResult.hasErrors()) { System.out.print(bindingResult.getFieldError().getDefaultMessage()); return null; } return userInfo; } }
|
总结
上面给出了常用的处理方法,在实际开发过程中,通常为了返回数据格式的统一,可能会全局捕获异常,然后统一返回,这个时候上述 Controller 中的 BindResult 和 if 判断语句就可以省略了,然后在全局中捕获
参考
Java SpringBoot上的参数校验JSR 303 Validation