Bean validation for Integer field
Asked Answered
B

1

5

I am trying to have constraint validation on the field, which must reject if the input is not an integer.

public class ClientTO {
       private Integer phone_num; //
}

I tried:

1) @Digits - It does not validate if input is integer or not as you could see the type mismatch exception is still thrown.

2) My custom validation - which seems to not work on Integer fields

Error:

Exception in thread "main" javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: java.lang.Integer.

My custom validation class:

public class X_CVAImpl implements ConstraintValidator<X_CustomValidatorAnnotation,String>{  
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // TODO Auto-generated method stub
        boolean val_d;
        if (value.matches("[0-9]+") && value.length() ==10) {
            val_d=true;
        }else {
            val_d=false;            
        }
        return val_d;
    }
}

Any help please?

Burns answered 15/11, 2018 at 14:9 Comment(4)
Seems that you declared a validator for String fields, but you annotated an Integer field with it. Beside that, why didn't you just apply the @Pattern constraint on a string field?Suricate
I am trying to construct entity on ClientTO to put it into MVC model, I did not want use string field as I wanted the entity properties of proper type so there wouldn't be any issues when put it into MVC model. trying to work on validator for Integer as you suggested.Burns
Using an integer field simply means that type checking would fail before bean validation if the wrong data is used. If you have to use Integer, then the only constraint you need is perhaps @NotNull, and whatever you use for serialization will take care of making sure that the data type is valid.Suricate
got it, thanks. Could you put it into answer.Burns
T
7

@Digits will only work for primitive types. So if you change your entity to the following, your validation should kick in.

public class ClientTO {
   @Digits(integer=10, fraction=0)
   private int phone_num; // Constraint: phone_num can only be 10 digits long or less
   ...
}

Having that said, I believe that you should use a string to validate a phone number.

public class ClientTO {
   @Size(min=10, max=10)
   @Pattern(regexp="(^[0-9]{10})")
   private String phone_num; // Constraint: phone_num would match 10 digits number
   ...
}
Tarpan answered 15/11, 2018 at 15:2 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.