使用 Hibernate 注释验证手机号码

新手上路,请多包涵

我有一个名为 User 的实体,我想验证一个手机号码字段

手机号码字段不是强制性的,它可以留空,但它应该是 一个 10 位数字。

如果用户输入任何长度 小于 10 位 的值,则应抛出错误。

下面是我的用户类。

 public class User {

    @Size(min=0,max=10)
    private String mobileNo;

}

当我如上所述使用 @Sized 注释时,我可以验证大于 10 的值,但如果用户输入的数字少于 10 位,则不会引发错误。

我的要求是,如果用户将有效的 mobileNo 字段留空,但如果输入了一个值,则验证应确保输入的数字为 10 位数字且仅为 10 位数字。

我应该为这个要求使用哪个注释?

原文由 Ankur Raiyani 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 885
2 个回答

@Size(min=10,max=10) 如果空白表示空值,则可以完成这项工作。

如果你不放 @NotNull 注释, null 值将通过验证。

如果您的空白表示空字符串,那么您需要使用 @Pattern 验证器:

 @Pattern(regexp="(^$|[0-9]{10})")

这匹配空字符串或 10 位数字。

原文由 Piotr Kochański 发布,翻译遵循 CC BY-SA 3.0 许可协议

对于那些正在使用 libphonenumber 寻找电话号码自定义验证器的人

PhoneNumber.java libphonenumber 需要区域设置进行验证,因此我们需要创建一个自定义类来存储电话和区域代码

public class PhoneNumber {

  @NotEmpty
  private String value;

  @NotEmpty
  private String locale;
}

@Phone 注释将用于注释字段以进行验证

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Documented
@Constraint(validatedBy = PhoneNumberValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Phone {
String locale() default "";

String message() default "Invalid phone number";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}

PhoneNumberValidator.java 它将检查手机对提供的区域代码的有效性

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class PhoneNumberValidator implements ConstraintValidator<Phone, PhoneNumber> {

    @Override
    public void initialize(Phone constraintAnnotation) {

    }

    @Override
    public boolean isValid(PhoneNumber phoneNumber, ConstraintValidatorContext context) {
        if(phoneNumber.getLocale()==null || phoneNumber.getValue()==null){
            return false;
        }
        try{
            PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
            return phoneNumberUtil.isValidNumber(phoneNumberUtil.parse(phoneNumber.getValue(), phoneNumber.getLocale()));
        }
        catch (NumberParseException e){
            return false;
        }
      }
    }

用法

@Phone
private PhoneNumber phone;

原文由 Raj 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题