当我尝试在我的 CRM Web 应用程序(PrimeFaces)中保存一些数据时,我得到了这个异常:
Caused by: javax.validation.ConstraintViolationException: Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'prePersist'. Please refer to embedded ConstraintViolations for details.
问题是我无法弄清楚这是什么原因。遗憾的是,日志堆栈 strace 根本不包含任何有用的信息......
我有很多断点,还插入了这个 ValidatorFactory 代码行,我在 StackOverflow 上找到了我拥有的 Insert 和 Edit 方法(这些在我的 AbstractFacade 类中),但是这个 ValidatorFactory 在实际保存方法之前给了我 0 个无效实体,所以我仍然不聪明......:
public T edit(T entity) {
logger.info("oldVersion {0}", new Object[]{entity.getVersion()});
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
javax.validation.Validator validator = factory.getValidator();
Set<ConstraintViolation<T>> constraintViolations = validator.validate(entity);
if (constraintViolations.size() > 0 ) {
logger.error("Constraint Violations occurred..");
for (ConstraintViolation<T> contraints : constraintViolations) {
logger.error(contraints.getRootBeanClass().getSimpleName()+
"." + contraints.getPropertyPath() + " " + contraints.getMessage());
}
getEntityManager().persist(entity);
}
try {
entity = (T) getEntityManager().merge(entity);
} catch (OptimisticLockException e) {
JsfUtil.addErrorMessage("Somebody already modified these lines:" + entity.getClass());
entity = find(entity.getId());
refresh(entity);
}
return entity;
}
错误出现在方法getEntityManager().merge(entity);
中调用之后edit()
。
有人知道现在该怎么做吗?
编辑:
我正在使用 Netbeans、EclipseLink (JPA 2.1) 和 Glassfish。日志说:“有关详细信息,请参阅嵌入式 ConstraintViolations。”
这个 EMBEDDED ConstraintViolations 到底在哪里?我在 Glassfish 日志中没有看到任何关于此的内容...
我还编辑了我的 persistence.xml:
<property name="eclipselink.logging.level" value="FINEST"/>
<property name="eclipselink.logging.level.sql" value="FINEST"/>
但是重新启动并重新测试后,我仍然只看到相同的日志条目,仅此而已......