SpringBoot 使用 @Valid 配合 BindingResult 校验数据

前言

在实际开发过程中,经常需要对前端传来的数据模型进行校验,一般情况下都是写一个专门的校验函数去校验,这种方式很显然不适合复杂的项目,因为随着项目复杂度的增加需要校验的数据模型越来越多,并且在开发过程中可能也需要时常修改数据模型,这就导致原来的校验方法可能需要时常的变动,也不利于维护。因为我们需要一种更简单的方式去完成这个工作。

@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