【问题标题】:Hibernate Class level validationHibernate 类级别验证
【发布时间】:2012-06-23 04:20:00
【问题描述】:

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

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;
    }
}

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

Block.java

@ValidBlock
public class Block{
   ...
}

和错误:

严重:javax.validation.ConstraintViolationException:验证 在持续时间内类 [com.labsys.model.Block] 失败 groups [javax.validation.groups.Default, ] 约束列表 违规行为:[ 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.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:94) 在 org.hibernate.action.internal.EntityInsertAction.preInsert(EntityInsertAction.java:185) 在 org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:81) 在 org.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.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326) 在 org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) 在 org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1214) 在 org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:981)

严重:JSF1073:javax.faces.event.AbortProcessingException obtido INVOKE_APPLICATION 5 的持续过程: UIComponent-ClientId=blockForm:j_idt14, 消息=javax.validation.ConstraintViolationException:验证 在持续时间内类 [com.labsys.model.Block] 失败 groups [javax.validation.groups.Default, ] 约束列表 违规行为:[ ConstraintViolationImpl{interpolatedMessage='{app.ValidBlock.message}', propertyPath=, rootBeanClass=class com.labsys.model.Block, messageTemplate='{app.ValidBlock.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}'} ]

【问题讨论】:

标签: java hibernate jsf


【解决方案1】:

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

【讨论】:

  • 即使我这样设置消息:@ValidBlock(message="That's a error") ?
  • Hibernate Validator 在刷新期间发现错误时,总是会给您带来讨厌的异常和无用的消息。如果你想要用户友好,你需要提前自己运行验证器。如果您找到解决此问题的方法,我很想知道它:)
  • @Affe 看看 javax.validation.ConstraintViolationException 类。如您所见,Set> constraintViolations 属性与您手动调用 validator.validate(obj) 时返回的内容相同。因此,预计您会捕获此异常并根据需要使用这些 constraintViolations。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 2011-04-22
  • 2015-12-29
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
相关资源
最近更新 更多