2023-05-21 12:12:15

自定义校验注解

  1. 自定义注解

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Constraint(validatedBy = {IsMobileValidator.class})
    public @interface IsMobile {

    // 校验出错时默认返回的消息
    String message() default "手机号格式错误";

    Class<?>[] groups() default {}; //用于分组校验

    Class<? extends Payload>[] payload() default {};

    String status() default "123";

    }
  2. 定义注解实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class IsMobileValidator implements ConstraintValidator<IsMobile, String> {

    //获取注解的属性值
    String status;

    @Override
    public void initialize(IsMobile constraintAnnotation) {
    status = constraintAnnotation.status();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
    //这里的value就是字段的值
    if (value == null) {
    return true;
    }
    return PhoneUtil.isMobile(value);
    }
    }

分组校验

什么是分组校验? 当多个接口共用一个请求对象,不同接口必须的字段不同,就用到了分组检验。主要用到了注解的group参数

比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Data
public class UserLoginDTO implements Serializable {
//用户名密码登录必须的参数
@NotBlank(message = "用户名不能为空", groups = UsernameLoginGroup.class)
@ApiModelProperty("用户名")
private String username;
@NotBlank(message = "密码不能为空", groups = UsernameLoginGroup.class)
@ApiModelProperty("密码")
private String password;

//短信登录必须的参数
@ApiModelProperty("手机号")
@IsMobile(groups = SmsLoginGroup.class)
@NotBlank(message = "手机号不能为空", groups = SmsLoginGroup.class)
private String mobile;
@NotBlank(message = "短信验证码不能为空", groups = SmsLoginGroup.class)
@ApiModelProperty("短信验证码")
private String smsCode;

/**
* 演示下分组校验,多个接口使用同一个对象时可以使用分组校验,因为不同接口所需的字段不同。 默认的分组是 Default.class 当然也可以使用多个实体~
*/
public interface UsernameLoginGroup {
}

public interface SmsLoginGroup {
}
}

使用: @Valid不支持分组校验,需要使用@Validated,其实就是通过group的class来进行匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@ApiOperation("用户名密码登录")
@PostMapping("/usernameLogin")
public Result usernameLogin(@Validated(value = UserLoginDTO.UsernameLoginGroup.class) @RequestBody UserLoginDTO userLoginDTO) {
//todo 验证码
userService.usernameLogin(userLoginDTO);
return Result.success();
}

@ApiOperation("用户名密码登录")
@PostMapping("/smsLogin")
public Result smsLogin(@Validated(value = {UserLoginDTO.SmsLoginGroup.class}) @RequestBody UserLoginDTO userLoginDTO) {
//todo 验证码
userService.usernameLogin(userLoginDTO);

Prev
2023-05-21 12:12:15
Next