2011-09-28 71 views
10

我在Netbeans 7中创建了一个用于保存实体的EJB Session facade。 我有一个保险和RatePlan类之间的多对多映射。在回调事件中执行自动Bean验证时违反了Bean验证约束:'prePersist'

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 facade是一个类似tis的简单类。

public class InsuranceFacade{ 
    public void saveInsurance(Insurance insurance){ 
     em.persist(insurance); 
    } 
} 

任何提示?

+0

我很想知道在这些实体中没有bean验证的具体注释时它可能是什么样的违规行为! – stratwine

+0

我实际上删除了所有的bean验证注释,以便代码更容易阅读...... =) –

回答

10

我想知道发生了什么Bean验证错误,但我不知道如何或在哪里找到它或如何配置和捕获它。

要知道发生了什么特定的约束违规,您可以检查捕获到的异常。 ConstraintViolationException.getConstraintViolations()返回一组您可以迭代和检查的ConstraintViolation

+0

您好,我的意思是在我的EJB外观类和保存操作中,我会使用try catch块来检查这个异常?你能证实我的理解吗?谢谢 –

+0

[此线程](http://stackoverflow.com/questions/3793649/why-session-bean-method-throw-ejbtransactionrolledbackexception-when-runtimeexcep/3793785#3793785),与内置的博客文章显示如何你可以有ConstraintVioldationException作为ApplicationException,并因此在客户端“按原样”获取它。对于我来说,在调用客户端有一个catch块,检查是否被违反,看起来不错。 – stratwine

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"); 
    } 
3

我得到了同样的问题,但经过寻找答案小时,终于让我找到它....您应该编辑您的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); 
    } 
} 

现在,此方法将提醒您哪些属性以及验证失败的原因。 我希望这对你有用,就像它对我一样。

0

在坚持实体的地方捕获以下异常。在我的情况下,它的EJB添加方法。我在哪里做em.persist()。然后检查服务器日志,您将看到哪些属性约束违规。

catch (ConstraintViolationException e) { 
     log.log(Level.SEVERE,"Exception: "); 
     e.getConstraintViolations().forEach(err->log.log(Level.SEVERE,err.toString())); 
    }