0

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

有效块.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;
    }
}

我进行了测试,我很确定我收到了 Block 对象,因为当验证返回 true 很好时,我只是返回 false 进行测试。

块.java

@ValidBlock
public class Block{
   ...
}

和错误:

严重:javax.validation.ConstraintViolationException:在组 [javax.validation.groups.Default,] 的持续时间内对类 [com.labsys.model.Block] 的验证失败,] 约束违规列表:[ ConstraintViolationImpl{interpolatedMessage='{app. ValidBlock.message}', propertyPath=, rootBeanClass=class com.labsys.model.Block, messageTemplate='{app.ValidBlock.message}'}] 在 org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java: 159) 在 org.hibernate.action.internal.EntityInsertAction.preInsert(EntityInsertAction.java:185) 在 org.hibernate.action.internal.EntityInsertAction 的 org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:94) .execute(EntityInsertAction.java:81) 在组织。hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362) 在 org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354) 在 org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue. java:275) 在 org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) 在 org.hibernate.internal.SessionImpl 的 org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326) .flush(SessionImpl.java:1214) 在 org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:981)275) 在 org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) 在 org.hibernate.internal.SessionImpl.flush 的 org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326) (SessionImpl.java:1214) 在 org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:981)275) 在 org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) 在 org.hibernate.internal.SessionImpl.flush 的 org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326) (SessionImpl.java:1214) 在 org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:981)

严重:JSF1073:javax.faces.event.AbortProcessingException obtido durante o processamento de INVOKE_APPLICATION 5:UIComponent-ClientId=blockForm:j_idt14,Message=javax.validation.ConstraintViolationException:在持久化期间对类 [com.labsys.model.Block] 的验证失败组的时间 [javax.validation.groups.Default, ] 约束违规列表:[ ConstraintViolationImpl{interpolatedMessage='{app.ValidBlock.message}', propertyPath=, rootBeanClass=class com.labsys.model.Block, messageTemplate=' {app.ValidBlock.message}'}] 严重:javax.validation.ConstraintViolationException:在组 [javax.validation.groups.Default,] 约束违规列表的持续时间内,类 [com.labsys.model.Block] 的验证失败:[ConstraintViolationImpl{interpolatedMessage='{app.ValidBlock。message}', propertyPath=, rootBeanClass=class com.labsys.model.Block, messageTemplate='{app.ValidBlock.message}'} ]

4

1 回答 1

1

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

于 2012-06-20T23:29:19.390 回答