springboot注解

7次阅读

共计 2220 个字符,预计需要花费 6 分钟才能阅读完成。

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 时期、时间 必须是一个未来的时间或日期
@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. 测试自定义注解的功能

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