在回调事件上执行自动Bean验证时违反了Bean验证约束:'prePersist'

时间:2011-09-28 07:45:58

标签: jpa java-ee bean-validation

我在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);
    }
}

任何提示?

4 个答案:

答案 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()));
    }