自定义校验注解
自定义注解
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"; }
|
定义注解实现
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) { 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;
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) { userService.usernameLogin(userLoginDTO); return Result.success(); }
@ApiOperation("用户名密码登录") @PostMapping("/smsLogin") public Result smsLogin(@Validated(value = {UserLoginDTO.SmsLoginGroup.class}) @RequestBody UserLoginDTO userLoginDTO) { userService.usernameLogin(userLoginDTO);
|