2015-01-09 3 views
0

В моем текущем весеннем проекте, я пытаюсь себе аннотации шаблона из javax.validation.constraints с полем поплавка, таким образом:использование @Pattern с Float полем

@Pattern(regexp = "[0-9]{2}.[0-9]{2}") 
private Float preco; 

но при попытке вставить или обновить юридическое лицо с этим полем, я получаю эту ошибку:

Caused by: javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: java.lang.Float. 
     at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.verifyResolveWasUnique(ConstraintValidatorManager.java:218) 
     at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.findMatchingValidatorClass(ConstraintValidatorManager.java:193) 
     at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.getInitializedValidator(ConstraintValidatorManager.java:97) 
     at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:125) 
     at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:91) 
     at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:83) 
     at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:547) 
     at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:487) 
     at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:451) 
     at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:403) 
     at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:206) 
     at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:137) 
     at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:95) 
     at org.hibernate.action.internal.EntityInsertAction.preInsert(EntityInsertAction.java:218) 
     at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:97) 
     at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:463) 
     at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:349) 
     at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350) 
     at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56) 
     at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222) 
     at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425) 
     at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) 
     at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177) 
     at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:77) 

Я пытаюсь добавить это в мой проект:

@Component 
public class FloatEditor extends PropertyEditorSupport { 
    @Override 
    public void setAsText(String text) { 
    if (!text.isEmpty()) { 
     Float numero = Float.parseFloat(text); 
     setValue(numero); 
    } 
    } 
} 

и добавьте л ine к методу intiBinder от моего контроллера:

binder.registerCustomEditor(Float.class, new FloatEditor()); 

но такая же ошибка случается. Кто-нибудь знает, как сделать эту работу?

ответ

5

@Pattern аннотация не может использоваться для проверки Float. Вам нужно создать пользовательские валидаторы. Вы можете найти код ниже:

валидатора аннотация:

@Target({ METHOD, FIELD, ANNOTATION_TYPE }) 
@Retention(RUNTIME) 
@Constraint(validatedBy = FloatValidator.class) 
@Documented 
public @interface FloatPattern { 

    String message() default "Float contraint voilated"; 

    Class<?>[] groups() default {}; 

    Class<? extends Payload>[] payload() default {}; 

} 

Класс валидатора: (я не добавил regualr проверки выражений, он просто проверяет наличие простой проверки Но она могла. быть расширена, чтобы сделать какой-либо проверки)

public class FloatValidator implements ConstraintValidator<FloatPattern, Float> { 

    @Override 
    public void initialize(final FloatPattern constraintAnnotation) { 

    } 

    @Override 
    public boolean isValid(final Float value, 
      final ConstraintValidatorContext context) { 
     return value > 11.11; 
    } 
} 

Пример класса с помощью этой аннотации

public class Sample { 

    @FloatPattern 
    Float preco; 

} 

Тест класс

Sample test = new Sample(); 
test.preco = 11.12f; 

ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
Validator validator = factory.getValidator(); 
Set<ConstraintViolation<Sample>> violations = validator.validate(test); 

for (final ConstraintViolation<Sample> cons : violations) { 
     System.out.println(cons.getMessage()); 
} 

Выход: (потому что проверка не пройдена)

Float contraint voilated 
Смежные вопросы