【发布时间】: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}'} ]
【问题讨论】:
-
我只是尝试进行自定义验证,而不是创建自己的框架。这有点可能,docs.jboss.org/hibernate/validator/4.3/reference/en-US/…
-
@Shahzeb - 这就是您使用 JSR303 创建自定义验证器的方式。