16

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

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

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

下面是我的用户类。

public class User {

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

}

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

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

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

4

6 回答 6

34

@Size(min=10,max=10)如果你的意思是空白,你会做这项工作。

如果您不添加@NotNull注释,则nullvalue 将通过验证。

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

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

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

于 2012-05-19T22:11:04.593 回答
9

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

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

public class PhoneNumber {

  @NotEmpty
  private String value;

  @NotEmpty
  private String locale;
}

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

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;
于 2018-08-24T11:56:42.407 回答
5

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

于 2013-05-22T08:30:53.780 回答
0

也许现在回答为时已晚,但 Hibernate Validator 中似乎有一个注释正是为了这个目的。

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

于 2020-05-16T09:21:11.897 回答
0

这将起作用,它支持BigDecimal, BigInteger, CharSequence, byte, short,int以及long原始类型的相应包装器。

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

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

于 2021-07-15T19:10:57.810 回答
0

也许现在回答你可以用 Hibernate Annotation 做这件事为时已晚。

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

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

我接受了最多 17位数字的验证,因为它还包括国际移动验证。

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

于 2022-03-04T14:27:12.137 回答