2012-06-20 116 views
0

那么,我读了几个关于使用hibernate进行类级别验证的问题(这里和其他站点),我创建了注释和验证类,但是当验证返回false时,我得到一个异常(当验证返回true好吧)该类无效(显然是因为验证返回false),我的疑问是:它不是也返回验证消息?为什么返回一个例外,代码:休眠类级别验证

ValidBlock.java

@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy = ValidBlockValidator.class) 
public @interface ValidBlock { 
    String message() default "{app.ValidBlock.message}"; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 
} 

ValidBlockValidator.java

public class ValidBlockValidator implements ConstraintValidator<ValidBlock, Block> { 

    @Override 
    public void initialize(ValidBlock aBlock) {} 

    @Override 
    public boolean isValid(Block value, ConstraintValidatorContext context) { 
     return false; 
    } 
} 

我做了测试,我敢肯定,我收到了块对象,如当验证返回true是好的我只是返回false来测试。

Block.java

@ValidBlock 
public class Block{ 
    ... 
} 

和错误:

Grave: javax.validation.ConstraintViolationException: Validation failed for classes [com.labsys.model.Block] during persist time for groups [javax.validation.groups.Default, ] List of constraint violations:[ ConstraintViolationImpl{interpolatedMessage='{app.ValidBlock.message}', propertyPath=, rootBeanClass=class com.labsys.model.Block, messageTemplate='{app.ValidBlock.message}'} ] at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:159) at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:94) at org.hibernate.action.internal.EntityInsertAction.preInsert(EntityInsertAction.java:185) at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:81) at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:275) at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326) at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1214) at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:981)

Grave: JSF1073: javax.faces.event.AbortProcessingException obtido durante o processamento de INVOKE_APPLICATION 5: UIComponent-ClientId=blockForm:j_idt14, Message=javax.validation.ConstraintViolationException: Validation failed for classes [com.labsys.model.Block] during persist time for groups [javax.validation.groups.Default, ] List of constraint violations:[ ConstraintViolationImpl{interpolatedMessage='{app.ValidBlock.message}', propertyPath=, rootBeanClass=class com.labsys.model.Block, messageTemplate='{app.ValidBlock.message}'} ] Grave: javax.validation.ConstraintViolationException: Validation failed for classes [com.labsys.model.Block] during persist time for groups [javax.validation.groups.Default, ] List of constraint violations:[ ConstraintViolationImpl{interpolatedMessage='{app.ValidBlock.message}', propertyPath=, rootBeanClass=class com.labsys.model.Block, messageTemplate='{app.ValidBlock.message}'} ]

+0

我试图做一个自定义的验证,而不是创建我自己的框架。这是有可能的,http://docs.jboss.org/hibernate/validator/4.3/reference/en-US/html_single/#d0e341 –

+0

@Shahzeb - 这就是你如何使用JSR303创建自定义验证器。 – Perception

回答

1

你需要创建一个ValidationMessages.properties文件并使其可在您的classpath的根目录,以便验证框架推断您的自定义消息。

+0

即使我设置这样的消息: @ValidBlock(message =“这是一个错误”)? –

+0

当Hibernate Validator在刷新时间内发现错误时,它总是会给你带来无用消息的恶意异常。如果你想用户友好,你需要提前自己运行验证器。如果你找到解决办法,我很想听听:) – Affe

+0

@Affe看看javax.validation.ConstraintViolationException类。正如你所看到的,Set > constraintViolations属性与手工调用validator.validate(obj)时返回的是相同的东西。所以,预计你可以捕获这个异常并按照你的意愿使用这些constraintViolations。 – Beccari