2011-09-28 73 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())); 
    }