You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用自定义注解校验手机号时如何展示多条提示信息?

实现自定义手机号校验的多场景提示信息

没问题,要实现自定义手机号校验时返回不同场景的提示信息,咱们可以通过扩展注解属性+在校验器中分支处理的方式来搞定,具体步骤如下:

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

火山引擎 最新活动