Bean Validation 规范内嵌的约束注解
空检查
@Null //被注解的元素必须为null
@NotNull //被注解的元素必须不为null
@NotEmpty //被注解的字符串的值必须非空
@NotBlank:只能作用在String上,不能为null,而且调用trim()后,长度必须大于0
@AssortTrue //被注解的元素必须为true
@AssortFalse //被注解的元素必须为false
@Min(value) //被注解的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) //被注解的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Size(max,min) //被注解的元素的大小必须在指定的范围内
@Digits(integer,fraction) //被注解的元素必须是一个数字,其值必须在可接受范围内
@Past //被注解元素必须是一个过去的日期
@Future //被注解元素必须是一个将来的日期
@Pattern(value) //被注解的元素必须符合指定的正则表达式
@Email //被注解的元素必须是电子邮箱地址
@Length //被注解的字符串的大小必须在指定的范围内
@Range //被注解的元素必须在合适的范围内
注意:除了空检查以外使用对应注解标注的字段的为空,验证规则不生效,建议加上@NotNull
@Validated和@Valid的区别和使用
- @Valid是JSR303声明的,Hibernate validation对其进行实现
- @Validated是只用Spring Validator校验机制使用
注解位置
1.@Validated:用在类型、方法和方法参数上。但不能用于成员属性(field)
2.@Valid:可以用在方法、构造函数、方法参数和成员属性(field)上
分组校验
@Validated支持 @Valid 不支持
嵌套校验
一个待验证的pojo类,其中还包含了待验证的对象,需要在待验证对象上注解@Valid,才能验证待验证对象中的成员属性,这里不能使用@Validated
分组校验
默认情况下 不同级别的约束验证是无序的,但是在一些情况下,顺序验证却是很重要。
一个组可以定义为其他组的序列,使用它进行验证的时候必须符合该序列规定的顺序。在使用组序列验证的时候,如果序列前边的组验证失败,则后面的组将不再给予验证
@Validated支持 @Valid 不支持
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
全局异常捕获
@Slf4j
@RestControllerAdvice(basePackages = "com.xpf.jsr303demo")
public class GlobalExceptionAdvice {
@ExceptionHandler(value = {MethodArgumentNotValidException.class, BindException.class})
public Result handleVaildException(Exception e) {
BindingResult bindingResult = null;
if (e instanceof MethodArgumentNotValidException) {
bindingResult = ((MethodArgumentNotValidException) e).getBindingResult();
} else if (e instanceof BindException){
bindingResult = ((BindException) e).getBindingResult();
}
Map<String, String> map = new HashMap<>(16);
bindingResult.getFieldErrors().forEach(fieldError -> map.put(fieldError.getField(), fieldError.getDefaultMessage()));
return Result.build(400, "非法参数", map);
}
}
参考于: