Validate Mobile Number using Hibernate annotation
For those who are looking for a custom validator for phone numbers using libphonenumber
PhoneNumber.java libphonenumber requires locale for validation so we need to create a custom class for storing phone and regioncode
public class PhoneNumber {
@NotEmpty
private String value;
@NotEmpty
private String locale;
}
@Phone Annotation Will be used to annotate fields for validation
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 It will check phone's validity for the provided region code
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;
}
}
}
Usage
@Phone
private PhoneNumber phone;
@Size(min=10,max=10)
would do the job if by blank you mean null.
If you don't put @NotNull
annotation, null
value would pass validation.
If your blank means empty String then you need to use @Pattern
validator:
@Pattern(regexp="(^$|[0-9]{10})")
this matches either empty string or 10 digits number.