How to validate number string as digit with hibernate?
Solution 1:
You could replace all your constraints with a single @Pattern(regexp="[\\d]{6}")
. This would imply a string of length six where each character is a digit.
Solution 2:
You can also create your own hibernate validation annotation.
In the example below I created a validation annotation with name EnsureNumber
. Fields with this annotation will validate with the isValid
method of the EnsureNumberValidator
class.
@Constraint(validatedBy = EnsureNumberValidator.class)
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface EnsureNumber {
String message() default "{PasswordMatch}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
boolean decimal() default false;
}
public class EnsureNumberValidator implements ConstraintValidator<EnsureNumber, Object> {
private EnsureNumber ensureNumber;
@Override
public void initialize(EnsureNumber constraintAnnotation) {
this.ensureNumber = constraintAnnotation;
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
// Check the state of the Adminstrator.
if (value == null) {
return false;
}
// Initialize it.
String regex = ensureNumber.decimal() ? "-?[0-9][0-9\\.\\,]*" : "-?[0-9]+";
String data = String.valueOf(value);
return data.matches(regex);
}
}
You can use it like this,
@NotEmpty
@Size(min = 6, max = 6)
@EnsureNumber
private String number1;
@NotEmpty
@Size(min = 6, max = 6)
@EnsureNumber(message = "Field number2 is not valid.")
private String number2;
@NotEmpty
@Size(min = 6, max = 6)
@EnsureNumber(decimal = true, message = "Field number is not valid.")
private String number3;
Solution 3:
The @Digits
annotation can be used to enforce that a string is a number in a given range:
@NotEmpty
@Digits(integer = 6, fraction = 0)
public String getNumber {
return number.trim();
}
Per the @Digits
Javadocs:
The annotated element must be a number within accepted range.
Supported types are:
BigDecimal
BigInteger
CharSequence
byte
,short
,int
,long
, and their respective wrapper types
null
elements are considered valid.