SpringBoot 注解校验
注解 | 作用类型 | 解释 |
---|---|---|
@NotNull | 任何类型 | 属性不能为 null |
@NotEmpty | 集合 | 集合不能为 null,且 size 大于 0 |
@NotBlanck | 字符串、字符 | 字符类不能为 null,且去掉空格之后长度大于 0 |
@AssertTrue | Boolean、boolean | 布尔属性必须是 true |
@Min | 数字类型(原子和包装) | 限定数字的最小值(整型) |
@Max | 同 @Min | 限定数字的最大值(整型) |
@DecimalMin | 同 @Min | 限定数字的最小值(字符串,可以是小数) |
@DecimalMax | 同 @Min | 限定数字的最大值(字符串,可以是小数) |
@Range | 数字类型(原子和包装) | 限定数字范围(长整型) |
@Length | 字符串 | 限定字符串长度 |
@Size | 集合 | 限定集合大小 |
@Past | 时间、日期 | 必须是一个过去的时间或日期 |
@Future | 时期、时间 | 必须是一个未来的时间或日期 |
字符串 | 必须是一个邮箱格式 | |
@Pattern | 字符串、字符 | 正则匹配字符串 |
自定义注解校验
1. 编写校验注解
// 我们可以直接拷贝系统内的注解如 @Min,复制到我们新的注解中,然后根据需要修改。@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Documented
// 注解的实现类。@Constraint(validatedBy = {IsMobileValidator.class})
public @interface IsMobile {
// 校验错误的默认信息
String message() default "手机号码格式有问题";
// 是否强制校验
boolean isRequired() default false;
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};}
2. 编写具体的实现类
我们知道注解只是一个标记,真正的逻辑还要在特定的类中实现,上一步的注解指定了实现校验功能的类为 IsMobileValidator。
// 自定义注解一定要实现 ConstraintValidator 接口奥,里面的两个参数
// 第一个为 具体要校验的注解
// 第二个为 校验的参数类型
public class IsMobileValidator implements ConstraintValidator<IsMobile, String> {
private boolean required = false;
private static final Pattern mobile_pattern = Pattern.compile("1\\d{10}");
// 工具方法,判断是否是手机号
public static boolean isMobile(String src) {if (StringUtils.isEmpty(src)) {return false;}
Matcher m = mobile_pattern.matcher(src);
return m.matches();}
@Override
public void initialize(IsMobile constraintAnnotation) {required = constraintAnnotation.isRequired();
}
@Override
public boolean isValid(String phone, ConstraintValidatorContext constraintValidatorContext) {
// 是否为手机号的实现
if (required) {return isMobile(phone);
} else {if (StringUtils.isEmpty(phone)) {return true;} else {return isMobile(phone);
}
}
}
}
3. 测试自定义注解的功能
@Data
public class User {
@NotNull
@Size(min=2, max=30,message = "请检查名字的长度是否有问题")
private String name;
@NotNull
@Min(18)
private Integer age;
// 这里是新添加的注解奥
@IsMobile
private String phone;
}
4. 验证
然后在 controller 的每个接口中使用 @Validated 和 BindingResult 类
@Validated 注解用于验证一个入参,验证之后的消息绑定到 BindingResult 类中:
@PostMapping("/test")
@ApiOperation(value = "测试", notes = "", response = Result.class)
public Result test(@ApiParam(name = "test", value = "参数", required = true) @Validated @RequestBody Test test, BindingResult bindingResult) {if(bindingResult.hasErrors()){String errorMsg = bindingResult.getFieldError().getDefaultMessage();
return Result.error(errorMsg);
}
return Result.ok("参数验证通过");
}