我在Netbeans 7中创建了一个EJB Session facade来保存我的实体。 我的保险和RatePlan类之间有很多地方的映射。
public class Insurance{
@ManyToOne(optional=false)
@JoinColumn(name="PLAN_ID")
private RatePlan plan;
}
public class RatePlan{
@OneToMany(mappedBy="plan")
private Set<Insurance> insuranceItems;
}
当我尝试使用EJB会话Bean保存数据库时,遇到以下错误。
引起:javax.validation.ConstraintViolationException:在回调事件上执行自动Bean验证时违反了Bean验证约束:'prePersist'。有关详细信息,请参阅嵌入式ConstraintViolations。
我所做的是在Persistence.xml文件中关闭我的Bean验证。 我想知道发生了什么Bean验证错误,但我不知道如何或在哪里找到它或如何配置和捕获它。
我的EJB外观是一个像tis这样的简单类。
public class InsuranceFacade{
public void saveInsurance(Insurance insurance){
em.persist(insurance);
}
}
任何提示?
答案 0 :(得分:11)
我想知道发生了什么Bean验证错误,但我不知道如何找到它或在何处找到它或者如何配置和捕获它。
要知道发生了哪些特定的约束违规,您可以检查捕获的异常。 ConstraintViolationException.getConstraintViolations()返回一组ConstraintViolation,您可以迭代并检查它们。
答案 1 :(得分:6)
catch (EJBException e) {
@SuppressWarnings("ThrowableResultIgnored")
Exception cause = e.getCausedByException();
if (cause instanceof ConstraintViolationException) {
@SuppressWarnings("ThrowableResultIgnored")
ConstraintViolationException cve = (ConstraintViolationException) e.getCausedByException();
for (Iterator<ConstraintViolation<?>> it = cve.getConstraintViolations().iterator(); it.hasNext();) {
ConstraintViolation<? extends Object> v = it.next();
System.err.println(v);
System.err.println("==>>"+v.getMessage());
}
}
Assert.fail("ejb exception");
}
答案 2 :(得分:6)
我遇到了同样的问题,但是经过几个小时的寻找答案,最后我发现了......你应该编辑 AbstractFacade.java 类并添加这个代码
public void create(T entity) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<T>> constraintViolations = validator.validate(entity);
if(constraintViolations.size() > 0){
Iterator<ConstraintViolation<T>> iterator = constraintViolations.iterator();
while(iterator.hasNext()){
ConstraintViolation<T> cv = iterator.next();
System.err.println(cv.getRootBeanClass().getName()+"."+cv.getPropertyPath() + " " +cv.getMessage());
JsfUtil.addErrorMessage(cv.getRootBeanClass().getSimpleName()+"."+cv.getPropertyPath() + " " +cv.getMessage());
}
}else{
getEntityManager().persist(entity);
}
}
现在,此方法将提醒您哪个属性及其验证失败的原因。 我希望这对你有用,就像对我一样。
答案 3 :(得分:0)
在持久化实体的情况下捕获以下异常。就我而言,它在EJB add方法中。我在做什么em.persist()
。然后检查服务器日志,您将看到哪个属性具有约束违规。
catch (ConstraintViolationException e) {
log.log(Level.SEVERE,"Exception: ");
e.getConstraintViolations().forEach(err->log.log(Level.SEVERE,err.toString()));
}