使用自定义注解校验手机号时如何展示多条提示信息?
实现自定义手机号校验的多场景提示信息
没问题,要实现自定义手机号校验时返回不同场景的提示信息,咱们可以通过扩展注解属性+在校验器中分支处理的方式来搞定,具体步骤如下:
1. 扩展自定义注解的消息属性
首先修改你的ContactNumberConstraint注解,为不同的错误场景添加独立的消息属性,既保留默认通用消息,又能针对空值、格式错误、长度不符等场景设置专属提示:
@Documented @Constraint(validatedBy = ContactNumberValidator.class) @Target({ ElementType.METHOD, ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) public @interface ContactNumberConstraint { // 通用默认错误消息 String message() default "Invalid phone number"; // 空值/空白时的提示 String messageEmpty() default "Phone number cannot be empty or blank"; // 长度不符合要求的提示 String messageInvalidLength() default "Phone number must be 11 digits long"; // 格式不匹配的提示 String messageInvalidFormat() default "Phone number format is invalid (must start with 1 and contain only digits)"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
2. 修改校验器,根据场景返回对应消息
接下来更新ContactNumberValidator,在初始化时读取注解中定义的各个场景消息,然后在校验逻辑中根据不同错误情况,替换默认的校验提示:
public class ContactNumberValidator implements ConstraintValidator<ContactNumberConstraint, String> { private String emptyMsg; private String invalidLengthMsg; private String invalidFormatMsg; @Override public void initialize(ContactNumberConstraint constraintAnnotation) { // 初始化时加载注解中配置的各场景消息 this.emptyMsg = constraintAnnotation.messageEmpty(); this.invalidLengthMsg = constraintAnnotation.messageInvalidLength(); this.invalidFormatMsg = constraintAnnotation.messageInvalidFormat(); } @Override public boolean isValid(String contactNumber, ConstraintValidatorContext context) { // 校验1:空值/空白处理 if (contactNumber == null || contactNumber.trim().isEmpty()) { // 禁用默认的错误提示,替换为自定义空值消息 context.disableDefaultConstraintViolation(); context.buildConstraintViolationWithTemplate(emptyMsg) .addConstraintViolation(); return false; } // 校验2:长度校验(这里以国内11位手机号为例) String trimmedNumber = contactNumber.trim(); if (trimmedNumber.length() != 11) { context.disableDefaultConstraintViolation(); context.buildConstraintViolationWithTemplate(invalidLengthMsg) .addConstraintViolation(); return false; } // 校验3:格式校验(正则匹配国内手机号规则) String phoneRegex = "^1[3-9]\\d{9}$"; if (!trimmedNumber.matches(phoneRegex)) { context.disableDefaultConstraintViolation(); context.buildConstraintViolationWithTemplate(invalidFormatMsg) .addConstraintViolation(); return false; } // 所有校验通过 return true; } }
3. 使用注解时自定义场景消息(可选)
如果需要在特定字段上覆盖默认的场景提示,直接在注解中指定对应属性即可:
public class UserProfile { @ContactNumberConstraint( messageEmpty = "请填写您的手机号", messageInvalidLength = "手机号必须是11位数字", messageInvalidFormat = "请输入有效的中国大陆手机号" ) private String phoneNumber; // getter、setter方法省略 }
这种方式灵活性很高,既可以使用默认的场景提示,也能根据业务需求在不同字段上定制专属提示,用户能清晰知道自己的错误出在哪里。
内容的提问来源于stack exchange,提问作者Shiladittya Chakraborty




