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;
@NotBlank
private String name;
@URL
private 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;
@Override
public void initialize(Contains constraintAnnotation) {
str= constraintAnnotation.str();
}
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
//s是字符串属性值
return s.startsWith(str);
}
}
Apipost测试: