2016-01-12 3 views
0

Я пытаюсь создать специальный валидатор для проверки только чисел для поля в форме.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 для параметра внутри метода.

Может быть что-то не так с конфиге или я что-то отсутствует

ответ

0

Насколько я знаю валидаторы только проверить данные, если вы в состоянии установить его. На данный момент ваше поле - Long, поэтому, когда вы пытаетесь создать новую сущность этого типа, например: "abc", она не сработает, потому что она не может преобразовать ее в число.

Validations запустить после этого, так что если вы хотите, чтобы убедиться, что пользователь может подать только номера, вы должны будете использовать String поле для roleId и написать свой валидатор так, что он анализирует строку и проверяет, является ли это номер или нет.

TL; DR: используйте String для roleId и измените свой валидатор, чтобы проверить, является ли строка номером (например, Integer.parseInt()).


Если вы используете это для ввода валидаций и вам нужно расцепить модель лица из модели, которая представляет пользователь, то вы должны создать два класса. Это одна из распространенных причин, по которой люди работают с отдельной моделью или DTO, если они работают с REST API.

На DTO вы положили поле String (для roleId), в то время как на объекте вы храните Long. В тот момент, когда вы уверены, что ваш DTO подтвержден, вы конвертируете его в объект и используете Integer.parseInt() (снова) для преобразования DTO в объект. Существуют специализированные фреймворки, которые помогают вам создавать структуры отображения, такие как Dozer, MapStruct, ....

+0

он действительно работает, создавая roldId String, но пользователь pojo является объектом в моей appication, который отображается на db (спящий режим) по аннотациям Таблица и Column.Therefore, roldId предположим, что он длинный, только как BigInt в моем db. Есть ли выход, чтобы справиться с этим? –

+0

@SiddhartRaut вы пытаетесь сделать проверку ввода? Потому что это одна из причин, по которой обычно используется DTO (если вы работаете с REST API) или модель между вашим пользователем и вашим объектом. В вашем DTO вы используете поле 'String' (с проверками), а на вашей сущности вы держите' Long'. После проверки DTO вы создаете объект на основе DTO. – g00glen00b

0

Я думаю, вам нужно, чтобы pojo было roleId как тип String.Также валидатор должен быть ConstraintValidator

Проблема с текущим кодом заключается в том, что он уже пытается преобразовать String -> Long. Таким образом, ввод недействителен, чем параметр roleId сам потерпел неудачу с «java.lang.NumberFormatException»