2012-08-06 95 views
2

我試圖開始使用簡單的Java EE應用程序,使用以下組成部分:JSF 2.0,JPA的EclipseLink,Glasshfish 3.如何禁用 「警告:javax.ejb.EJBException異常」

下面是一些片段,支持bean:

@Inject 
private ProductsFacade model;  
public void saveRow(Products p) { 
     model.edit(p); 
} 

ProductsFacade:

@Stateless 
public class ProductsFacade extends AbstractFacade<Products> { 
    @PersistenceContext 
    private EntityManager em; 
    public void edit(Products entity) { 
     em.merge(entity); 
    } 
    .... 

產品是一個實體Bean與Bean驗證註解。

現在,當用戶填寫表格不正確「model.edit」拋出EJBException異常,我處理它 與捕捉,所以saveRow後臺bean的方法現在看起來不那麼簡潔:

public void saveRow(Products p) { 
    try { 
     model.edit(p); 
    } catch (EJBException e) { 
     if(e.getCause().getClass().getName().equals("javax.validation.ConstraintViolationException")) { 
      handleConstraintViolation((ConstraintViolationException)e.getCause()); 
     } 
    } 
} 

而且還是GlassFish的日誌充滿了「警告:javax.ejb.EJBException「和較長的跟蹤。 我有一些問題:

  1. 我的設置有多正確?我知道jsf應該處理BeanValidation,但它不適用於我的情況。
  2. 如何禁用EJBException警告,所以服務器日誌不會被污染
  3. 有沒有更好的方法來處理EjbException?

回答

1

EJBException s觸發器回滾當前的JTA事務,無論你是否捕獲它們。對ProductsFacade#edit()的調用開始一個事務(除非有人傳播給它,這似乎不是這種情況),因爲它是從外部調用到SessionBean中的。如果您不希望事務在這些情況下回滾,則必須先將某個地方的用戶/客戶端輸入驗證,然後再將損壞的Entity指定爲EntityManager

有幾個怪癖和東西在這裏做,以避免這種情況。例如,您可以讓ProductsFacade處理事務:@TransactionManagement(TransactionManagementType.BEAN),但這會消除使用EJB的很大一部分。我確實認爲這種默認行爲是應該的。如果你不想在你的日誌中回滾你可以配置你的日誌級別/ etc - 但我確實認爲EJB分層事務回滾屬於日誌,它在開發過程中肯定會。