Spring Boot 提供了一组基于 Hibernate Validator 的校验注解,用于验证请求参数、实体对象等数据的合法性。下面是一些常用的 Spring Boot 校验注解及其功能:
导入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>
@Null 限制只能为null
@NotNull 适用于任何类型被注解的元素必须不能与NULL
@NotEmpty 适用于String Map或者数组不能为Null且长度必须大于0
@NotBlank 只能用于String上面 不能为null,调用trim()后,长度必须大于0
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Past 验证注解的元素值(日期类型)比当前时间早
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
针对于校验注解统一异常处理:
@RestControllerAdvice
public class MethodArgumentNotValidExceptionHandle {//统一异常处理@ExceptionHandler(MethodArgumentNotValidException.class)public RespResult result(MethodArgumentNotValidException exception){BindingResult bindingResult = exception.getBindingResult();Map<String,String> map=new HashMap<>();bindingResult.getFieldErrors().forEach(i->{map.put(i.getField(),i.getDefaultMessage());});return RespResult.ok(map);}
}
在 Spring Boot 中,可以通过自定义注解和对应的校验器来实现自定义校验注解。下面是实现自定义校验注解的步骤:设计一个@Contains限制字符串必须包含某个前缀字符串。
实体类如下:
@TableName(value ="brand")
@Data
public class Brand implements Serializable {@TableId(type= IdType.AUTO)private Integer id;@NotBlankprivate String name;@URLprivate String image;@Contains(str = "brand")private String initial;@Min(value = 0)@Max(value = 10)private Integer sort;private static final long serialVersionUID = 1L;
}
@Contains注解
@Documented
@Constraint(validatedBy = {ContainsForString.class}
)
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Contains {String message() default "没有包含指定前缀的字符串";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};String str() default "";
}public class ContainsForString implements ConstraintValidator<Contains,String> {private String str;@Overridepublic void initialize(Contains constraintAnnotation) {str= constraintAnnotation.str();}@Overridepublic boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {//s是字符串属性值return s.startsWith(str);}
}
Apipost测试: