SpringBoot注解校验

注解作用类型解释
@NotNull任何类型属性不能为null
@NotEmpty集合集合不能为null,且size大于0
@NotBlanck字符串、字符字符类不能为null,且去掉空格之后长度大于0
@AssertTrueBoolean、boolean布尔属性必须是true
@Min数字类型(原子和包装)限定数字的最小值(整型)
@Max同@Min限定数字的最大值(整型)
@DecimalMin同@Min限定数字的最小值(字符串,可以是小数)
@DecimalMax同@Min限定数字的最大值(字符串,可以是小数)
@Range数字类型(原子和包装)限定数字范围(长整型)
@Length字符串限定字符串长度
@Size集合限定集合大小
@Past时间、日期必须是一个过去的时间或日期
@Future时期、时间必须是一个未来的时间或日期
@Email字符串必须是一个邮箱格式
@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. 测试自定义注解的功能

@Datapublic 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("参数验证通过");}