使用 Hibernate 注释验证手机号码

问题描述 投票:0回答:7

我有一个名为“用户”的实体,我想验证手机号码字段

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

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

下面是我的用户类。

public class User {

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

}

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

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

我应该使用哪个注释来满足此要求?

java bean-validation hibernate-validator phone-number
7个回答
38
投票
如果空白表示空,则

@Size(min=10,max=10)
可以完成这项工作。

如果不添加

@NotNull
注释,
null
值将通过验证。

如果你的空白意味着空字符串那么你需要使用

@Pattern
验证器:

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

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


13
投票

对于那些正在使用 libphonenumber

寻找电话号码自定义验证器的人

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

public class PhoneNumber {

  @NotEmpty
  private String value;

  @NotEmpty
  private String locale;
}

@手机注解 将用于注释字段以进行验证

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 {};
}

电话号码验证器.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;

6
投票

也许您可以使用 Google 代码中的 libphonenumber 来改进建议的响应,以验证您的电话号码。


0
投票

也许现在回答已经太晚了,但 Hibernate Validator 中似乎有一个注释正是用于此目的。

这是@Digits(integer=,fraction=)注释。如果将整数属性指定为 10,则字符串将恰好有 10 位数字。它可以应用于 BigInteger(其他数字类型),也可以应用于字符串。有关更多信息,请参阅此处


0
投票

这可以工作,它支持

BigDecimal
BigInteger
CharSequence
byte
short
int
long
以及原始类型的相应包装器。

@Range(min = 10,max= 10, message = "phone_no should be exact 10 characters." )

它检查注释值是否位于(含)指定的最小值和最大值之间。


0
投票

也许现在回答已经太晚了,你可以用 Hibernate Annotation 来做这件事。

您必须在模型中定义 @Size 注释。

@Size(min = 10, max = 17, message = "数量至少应有 10 或 少于 17 位")

我采用了最大 17 数字验证,因为它还包括国际移动验证。

通过使用 @Size,如果您写的小于 10 或大于 17,您可以从注释中找到错误消息。


0
投票

使用正则表达式,我们可以验证手机号码是否为空或恰好由十位数字组成。

进口声明:

import javax.validation.constraints.Pattern;

注释:

@Pattern(regexp = "^$|^\\d{10}$", message = "should be empty or 10 digits")

说明:

  • ^ 断言输入字符串的开头。
  • $ 断言输入字符串的结尾。
  • |是逻辑或运算符。

因此,^$|^\d{10}$ 可以解释如下:

  • ^$ 匹配空字符串。这允许“mobileNo”字段为空值。
  • ^\d{10}$ 匹配正好由十位数字组成的字符串。 \d{10} 部分指定需要正好十个数字 (0-9)。

通过将 ^$ 和 ^\d{10}$ 与逻辑 OR 运算符 | 结合起来,正则表达式允许“mobileNo”字段为空或恰好由十位数字组成。

注意:这里我使用了双反斜杠(\),因为在正则表达式中,\d代表数字字符。要将此模式包含在 Java 字符串中,我们应该将其写为 \d

© www.soinside.com 2019 - 2024. All rights reserved.