一、@Validated和@Valid的区别
@Valid属于标准
JSR-303
规范的标记型注解,@Validated则是Spring的注解,是对JSR-303
的补充
@Valid可以用在属性级别约束,用来表示级联校验。
- 主要区别
@Validated | @Valid | |
分组 | 提供分组功能,可在入参验证时,根据不同的分组采用不同的验证机制。 | 无分组功能 |
可注解位置 | 可以用在类型、方法和方法参数上。但是不能用在成员属性上 | 可以用在方法、构造函数、方法参数和成员属性上(两者是否能用于成员属性上直接影响能否提供嵌套验证的功能) |
嵌套验证 | 用在方法入参上无法单独提供嵌套验证功能。 不能用在成员属性上。 也无法提供框架进行嵌套验证。 能配合嵌套验证注解@Valid进行嵌套验证。 | 用在方法入参上无法单独提供嵌套验证功能。 能够用在成员属性上,提示验证框架进行嵌套验证。 能配合嵌套验证注解@Valid进行嵌套验证。 |
二、使用校验
- @Validated打在类上是开启方法验证
@Validated
public class UserController {
@Autowired
UserService userService;
@PostMapping("/list")
public HttpResult listAll(@RequestBody User user) {
return userService.insertUser());
}
}
- 实体参数上的验证注解标注
@Data
public class User{
@NotBlank(message = "用户名不能为空")
primary String username;
}
- 统一异常处理
/**
* 自定义验证异常
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public HttpResult validMethodException(MethodArgumentNotValidException e) {
log.error(e.getMessage(), e);
List<ObjectError> errors = e.getBindingResult().getAllErrors();
StringBuilder message = new StringBuilder();
errors.forEach(x -> message.append(x.getDefaultMessage()).append(";"));
return HttpResult.error(message.toString());
}
三、常用注解类型
@AssertFalse 校验false
@AssertTrue 校验true
@DecimalMax(value=,inclusive=) 小于等于value,inclusive=true,是小于等于
@DecimalMin(value=,inclusive=) 与上类似
@Max(value=) 小于等于value
@Min(value=) 大于等于value
@NotNull 检查Null
@Past 检查日期
@Pattern(regex=,flag=) 正则
@Size(min=, max=) 字符串,集合,map限制大小
@Validate 对po实体类进行校验
四、嵌套校验
- 嵌套校验即:一个实体类中包含了另外一个实体类
public class Student{
private List<Teacher> teacherList;
}
@RestController
public class StuController {
@RequestMapping("/item/add")
public void addItem(@Validated Student stu) {
doSomething();
}
}
无论是
@Validated
还是@Valid
,单独都无法使直接校验到Teacher
实体
- 所以需要修改,在嵌套的实体上再加
@Valid
,在需要嵌套验证类的相应字段上,来配合方法参数上@Validated或@Valid
来进行嵌套验证。
public class Student{
@Valid
private List<Teacher> teacherList;
}