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测试: