使用Hibernate注释验证移动号码

时间:2012-05-17 08:06:19

标签: java bean-validation hibernate-validator phone-number

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

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

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

以下是我的用户类。

public class User {

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

}

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

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

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

5 个答案:

答案 0 :(得分:25)

@Size(min=10,max=10)如果空白则表示无效。

如果您未添加@NotNull注释,null值将通过验证。

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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

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;

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

这会起作用,它支持BigDecimalBigIntegerCharSequencebyteshortintlong以及原始类型的相应包装器。

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

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