我使用Glassfish 3.1和JSF2以及EJB無狀態來查詢和編寫Oracle數據庫。用戶想要在此Web應用程序中填充的表具有主鍵。當用戶嘗試添加新記錄時,會調用調用em.persist的ejb方法。現在,如果用戶試圖添加一個已經使用過主鍵值的記錄,那麼我在EJB中發現了一個異常。 我想彈出一條消息給用戶,指出數據庫中發生錯誤,但我無法弄清楚JSF託管bean如何捕獲EJB異常。 有什麼辦法嗎?在JSF + EJB應用程序中捕獲數據庫異常
3
A
回答
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
繼承並標註有該@ApplicationException
與rollback
屬性設置爲true。
E.g.
@ApplicationException(rollback = true)
public class MyException extends RuntimeException {
public MyException(Throwable cause) {
super(cause);
}
}
將您的EntityExistsException
包裝到您的EJB中,並將其拋出並捕獲它。
我強烈建議你不要使用錯誤代碼或布爾成功/失敗作爲結果。這是一個衆所周知的反模式,並使您的代碼難以置信的出錯。
2
您可以創建自定義的異常類。假設UserException
帶有可能的異常選項的枚舉值。
在你的EJB中,你可以將你的方法定義爲可拋出的。如果你需要拋出異常。
在你的JSF-SiteBean中,你只需要使用一個簡單的try/catch。
是從類型UserException ...得到枚舉理由例外...等
相關問題
- 1. 在Kohana中捕獲數據庫異常
- 2. 在Symfony2中捕獲數據庫異常
- 3. ACRA應用程序崩潰庫不捕獲設備異常
- 4. 程序錯誤異常不應該被應用程序捕獲
- 5. 如何捕獲數據庫異常?
- 6. 客戶JSF異常處理程序不捕獲異常在轉換器
- 7. 如何在c#中的Windows應用程序中捕獲異常?
- 8. 在playframework中捕捉數據庫異常
- 9. 在Windows窗體應用程序中捕獲應用程序異常
- 10. 應該檢查重複或從數據庫中捕獲異常?
- 11. 如何在java fx應用程序中捕獲任務異常?
- 12. 在javax.swing應用程序中捕獲異常
- 13. 在控制檯應用程序中捕獲異常C#
- 14. 在Eclipse/Java應用程序中被捕獲的異常通知
- 15. 如何在iPhone應用程序中捕獲所有異常
- 16. 如何在Java Servlet Web應用程序中捕獲未捕獲的異常
- 17. 如何在黑莓應用程序中捕獲未被捕獲的異常?
- 18. 獲取遠程EJB異常
- 19. 如何在JSF/EJB應用程序中存儲應用程序參數?
- 20. 當通過JSF + EJB應用程序持久化時,在數據庫中獲取null參數
- 21. 如何捕獲wxPython應用程序中的所有異常?
- 22. 捕獲Rails 3應用程序中的所有異常
- 23. 在應用程序啓動時捕獲異常(VS.Net)
- 24. 如何捕獲所有異常/崩潰在.NET應用程序
- 25. 終止應用程序由於未捕獲的異常「NSInvalidArgumentException」 - 在
- 26. 終止應用程序由於未捕獲的異常「NSInternalInconsistencyException」在
- 27. 應用程序或應用程序是否應該捕獲錯誤異常?
- 28. 如何在Zend的(1.11)ErrorController中捕獲數據庫異常?
- 29. 如何在ios中捕獲數據庫異常?
- 30. Java應用程序層不捕獲SQL存儲過程異常
謝謝你讓我知道,我不知道這是如何工作。順便說一句,這就是爲什麼我寫了據我所知。 – 2012-03-20 20:33:36