Я пытаюсь создать специальный валидатор для проверки только чисел для поля в форме.Spring Custom Validator Not Working
OnlyNumber.java (Аннотация)
@Target({ElementType.FIELD})
@Retention(value = RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { OnlyNumberValidator.class })
public @interface OnlyNumber {
String message() default "Enter only Numbers";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
OnlyNumberValidator.java (валидатор)
public class OnlyNumberValidator implements ConstraintValidator<OnlyNumber, Long> {
@Override
public void initialize(OnlyNumber o) {
}
@Override
public boolean isValid(Long str, ConstraintValidatorContext c) {
System.out.println("Inside OnlyNumberValidator Str "+str);
try
{
//logic goes here
return true;
}
catch (Exception e)
{
return false;
}
}
}
User.java (Pojo)
@Entity
@Table(name = "user_table")
public class User extends CommonBean {
@IgnoreMe
@Transient
private static final long serialVersionUID = 1L;
@OnlyNumber(message="Role Id Can be Only Number") //Custom Annotation
@Column(name="ROLE_ID")
private Long roleId;
........
}
проверки зависимостей добавил:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.2.Final</version>
</dependency>
Детали проекта: - Spring загрузки 1.3.1
Когда я запустить приложение я получаю сообщение об ошибке на JSP, говоря Не удалось преобразовать значение свойства типа ' java.lang.String 'для требуемого типа «java.lang.Long» для свойства «roleId»; вложенное исключение java.lang.NumberFormatException: Для ввода строки: «а»
вместо я должен получить сообщение об ошибке Id Роль может быть только номер , когда я проверил журнал в методе IsValid моего пользовательского валидатора я получаю null для параметра внутри метода.
Может быть что-то не так с конфиге или я что-то отсутствует
он действительно работает, создавая roldId String, но пользователь pojo является объектом в моей appication, который отображается на db (спящий режим) по аннотациям Таблица и Column.Therefore, roldId предположим, что он длинный, только как BigInt в моем db. Есть ли выход, чтобы справиться с этим? –
@SiddhartRaut вы пытаетесь сделать проверку ввода? Потому что это одна из причин, по которой обычно используется DTO (если вы работаете с REST API) или модель между вашим пользователем и вашим объектом. В вашем DTO вы используете поле 'String' (с проверками), а на вашей сущности вы держите' Long'. После проверки DTO вы создаете объект на основе DTO. – g00glen00b