1. 添加Validation依赖
>
>org.springframework.boot >
>spring-boot-starter-validation >
>
2. User类,添加校验注解
@Getter
@Setter
@ToString
public class User {
private Long id;
@Size(min = 5, max = 12)
private String name;
@DecimalMin(value = "1")
@DecimalMax(value = "100")
private Integer age;
@NotBlank
private Integer sex;
@NotBlank
private String address;
@NotBlank
@Email
private String email;
}
3. UserController业务处理类
接口需要添加 @Validated 注解
@RestController
public class UserController {
@PostMapping("user")
public void addUser(@Validated @RequestBody User user, BindingResult result) {
// BindingResult 校验错误信息结果
if (result != null && result.hasErrors()){
List<ObjectError> allErrors = result.getAllErrors();
for (ObjectError error : allErrors) {
System.out.println(error.getObjectName() + " " + error.getDefaultMessage());
}
}else {
System.out.println("用户信息校验成功");
}
}
}
4. 不合法数据测试
POST:localhost:8081/user
{
"name":"123",
"age":123,
"sex":1,
"email":"123"
}
打印结果:
user 不能为空
user 个数必须在5和12之间
user 不是一个合法的电子邮件地址
user 必须小于或等于100
1. 在resources下创建ValidationMessages.properties配置文件
user.name=用户名长度必须在5~12之间
user.age.min=年龄必须大于等于1
user.age.max=年龄必须小于等于100
user.sex=性别不能为空
user.address=地址不能为空
user.email.notblank=邮箱不能为空
user.email.pattern=邮箱格式不正确
2. 校验注解上,指定返回信息
@Getter
@Setter
@ToString
public class User {
private Long id;
@Size(min = 5, max = 12, message = "{user.name}")
private String name;
@DecimalMin(value = "1", message = "{user.age.min}")
@DecimalMax(value = "100", message = "{user.age.max}")
private Integer age;
@NotNull(message = "{user.sex}")
private Integer sex;
@NotBlank(message = "{user.address}")
private String address;
@NotBlank(message = "{user.email.notblank}")
@Email(message = "{user.email.pattern}")
private String email;
}
再次访问接口,打印结果:
user 地址不能为空
user 用户名长度必须5~12字符
user 年龄必须小于等于100
user 邮箱格式不正确
由于校验规则都是定义在实体类上面的,但是,在不同的数据提交环境下,校验规则可能不一样。例如,用户的 id 是自增长的,添加的时候,可以不用传递用户 id,但是修改的时候则必须传递用户 id,这种情况下,就需要使用分组校验。
1.分组校验,首先需要定义校验组,所谓的校验组,其实就是空接口:
public interface ValidationGroup1 {
}
public interface ValidationGroup2 {
}
2.然后,在实体类中,指定校验规则所属的组 groups,一个规则可以属于一个组,也可以属于多个组。不指定则不校验:
@Getter
@Setter
@ToString
public class User {
private Long id;
@Size(min = 5, max = 12, message = "{user.name}", groups = {ValidationGroup1.class})
private String name;
@DecimalMin(value = "1", message = "{user.age.min}")
@DecimalMax(value = "100", message = "{user.age.max}", groups = {ValidationGroup1.class,ValidationGroup2.class})
private Integer age;
@NotNull(message = "{user.sex}")
private Integer sex;
@NotBlank(message = "{user.address}")
private String address;
@NotBlank(message = "{user.email.notblank}")
@Email(message = "{user.email.pattern}", groups = {ValidationGroup2.class})
private String email;
}
3.最后,在接收参数的地方,指定校验组 @Validated(value = {}):
@RestController
public class UserController {
@PostMapping("user")
public void addUser(@Validated(value = {ValidationGroup1.class}) @RequestBody User user, BindingResult result) {
// BindingResult 校验错误信息结果
if (result != null && result.hasErrors()){
List<ObjectError> allErrors = result.getAllErrors();
for (ObjectError error : allErrors) {
System.out.println(error.getObjectName() + " " + error.getDefaultMessage());
}
}else {
System.out.println("用户信息校验成功");
}
}
}
4.不合法数据测试。分组1只校验了名字和最大年龄,其他字段不会被校验
POST:localhost:8081/user
{
"name":"123",
"age":123,
"sex":1,
"email":"123"
}
打印结果:
user 年龄必须小于等于100
user 用户名长度必须在5~12之间
参考文章:http://itboyhub.com/2021/01/28/springmvc-exception-validation/