2012-03-20 62 views
3

我使用Glassfish 3.1和JSF2以及EJB無狀態來查詢和編寫Oracle數據庫。用戶想要在此Web應用程序中填充的表具有主鍵。當用戶嘗試添加新記錄時,會調用調用em.persist的ejb方法。現在,如果用戶試圖添加一個已經使用過主鍵值的記錄,那麼我在EJB中發現了一個異常。 我想彈出一條消息給用戶,指出數據庫中發生錯誤,但我無法弄清楚JSF託管bean如何捕獲EJB異常。 有什麼辦法嗎?在JSF + EJB應用程序中捕獲數據庫異常

回答

6

EJB有系統異常和應用程序異常的概念。

運行時異常,例如EntityExistsException是系統異常。這些將導致任何事務被回滾並導致EJB實例bean被丟棄(銷燬)。最重要的是你的問題,他們將被包裹在EJBException

圍繞這些例外沒有什麼魔法。從切赫上述調整的代碼,
下面將只是工作:

支持bean:

@EJB 
private DAOBean daoBean; 

public void savePerson(Entity e) { 
    try { 
     daoBean.save(e); 
    } catch (EJBException e) {   
     FacesMessage message = new FacesMessage("entity is already exists."); 
     FacesContext.getCurrentInstance.addMessage(null, message); 
    }   
} 

EJB:

private EntityManager em; 

public void save(Entity e) {  
    em.persist(e);  
} 

請注意,您可以檢索異常的原因看如果是EntityExistsException或不是(爲簡潔起見,以上省略)。

因爲你很可能沒有必要摧毀你的EJB實例這種情況下,一個更好的模式來定義自己的異常,從一個RuntimeException繼承並標註有該@ApplicationExceptionrollback屬性設置爲true。

E.g.

@ApplicationException(rollback = true) 
public class MyException extends RuntimeException { 

    public MyException(Throwable cause) { 
     super(cause); 
    } 
} 

將您的EntityExistsException包裝到您的EJB中,並將其拋出並捕獲它。

我強烈建議你不要使用錯誤代碼或布爾成功/失敗作爲結果。這是一個衆所周知的反模式,並使您的代碼難以置信的出錯。

+0

謝謝你讓我知道,我不知道這是如何工作。順便說一句,這就是爲什麼我寫了據我所知。 – 2012-03-20 20:33:36

2

您可以創建自定義的異常類。假設UserException帶有可能的異常選項的枚舉值。

在你的EJB中,你可以將你的方法定義爲可拋出的。如果你需要拋出異常。

在你的JSF-SiteBean中,你只需要使用一個簡單的try/catch。

是從類型UserException ...得到枚舉理由例外...等

相關問題